1

32 個のスレッドと、各スレッドが独立して操作する 32 個のデータがあるとします。たとえば、

struct data
{
  unsigned short int N;
  char *features;  //array length N
  uint *values;  //array length N
};

data alldata[32];

これらのスレッドの共有メモリが 32 の「バンク」に「分割」されており、各バンクが 4 バイト幅であるとします。 各スレッドは、対応する「バンク」から並行して読み取ることができますが、スレッドが同じバンクに同時にアクセスしようとすると、読み取り操作がシリアル化されます。

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] の変数のメンバーを 2 列目などにします。

つまり、 の内容をalldata[32]1 つの動的配列に書き込む必要があります。ここでは、 のメンバー変数がalldata[j]4 バイト間隔で 1 バイトごとに書き込まれ32*4ます。次に、この動的配列をスレッドの共有メモリにコピーすると、バンクに対して適切に配置されます。

質問: 上記で説明したように (バイトごとに 1 回)、適切な間隔でバイト配列に変数を書き込むパッケージを知っている人はい32*4ますか?

これは絶望的な質問です...

4

0 に答える 0