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
ますか?
これは絶望的な質問です...