打包具有奇怪对齐要求的字节数组

时间:2013-02-20 15:13:49

标签: c++ c memory-management bytearray gpu

假设每个线程有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个字节一次)?

这是一个绝望的问题......

0 个答案:

没有答案