假设每个线程有32个线程和32个数据可以独立操作,例如
struct data
{
unsigned short int N;
char *features; //array length N
uint *values; //array length N
};
data alldata[32];
假设这些线程的共享内存被“分区”为32个“bank”,每个bank的宽度为4个字节。 每个线程可以并行读取相应的“bank”,但如果线程尝试同时访问同一个bank,则read操作会序列化。
bank | 0 | 1 | 2 | .....
bytes | 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | ....
bytes | 128 129 130 131 | 132 133 134 135 | 136 137 138 139 | ...
...............
...............
threads | 0 | 1 | 2 | .....
(这种奇怪的情况称为GPU计算)。
因此,为了最大化并行化: (就上图而言)alldata [0]的成员变量只能写入第一列的字节。 alldata [1]的变量成员到第二列等等。
换句话说,我必须将alldata[32]
的内容写入一个动态数组,其中alldata[j]
的成员变量以每32*4
个字节一次的4字节间隔写入。然后,当我将这个动态数组复制到线程的共享内存中时,它将正确地与银行对齐。
问题:
有没有人知道将变量写入具有适当间距的字节数组的任何类型的包,如上所述(每32*4
个字节一次)?
这是一个绝望的问题......