假设您有 32 个线程和 32 条数据供每个线程独立操作,例如
struct data
{
unsigned short int N;
char *features; //array length N
uint *values; //array length N
};
data alldata[32];
假设这些线程的共享内存被“分区”为 32 个“banks”,其中每个 bank 为 4 个字节宽。 每个线程都可以并行读取其对应的“bank”,但如果线程尝试同时访问同一个 bank,则读取操作会串行化。
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]
以 4 字节的间隔写入每个32*4
字节一次。然后,当我将此动态数组复制到线程的共享内存中时,它将为银行正确对齐。
问题:
是否有人知道任何类型的包可以将变量写入具有适当间距的字节数组,如上所述(每个32*4
字节一次)?
这是一个绝望的问题...