マルチスレッドプログラミングは初めてです。最近、私は cilk_for を適用するプロジェクトを持っています。コードは次のとおりです。
void myfunction(short *myarray)
{
m128i *array = (m128i*) myarray
cilk_for(int i=0; i<N_LOOP1; i++)
{
for(int z = 0; z<N_LOOP2; z+=8)
{
array[z] = _mm_and_si128(array[z],mym128i);
array[z+1] = _mm_and_si128(array[z+1],mym128i);
array[z+2] = _mm_and_si128(array[z+2],mym128i);
array[z+3] = _mm_and_si128(array[z+3],mym128i);
array[z+4] = _mm_and_si128(array[z+4],mym128i);
array[z+5] = _mm_and_si128(array[z+5],mym128i);
array[z+6] = _mm_and_si128(array[z+6],mym128i);
array[z+7] = _mm_and_si128(array[z+7],mym128i);
array+=8;
}
}
}
上記のコードが実行された後、とんでもないことが起こります。配列のデータが正しく更新されていません。たとえば、1000 要素の配列がある場合、配列が正しく更新される可能性があります (1000 要素は AND 演算されます)。ただし、配列の一部が省略される可能性もあります (最初の要素から 300 番目の要素は AND 演算され、301 番目の要素から 505 番目の要素は AND 演算されず、506 番目の要素から 707 番目の要素は AND 演算されます、など)。 ...)。これらの省略された部分は、個々の実行ごとにランダムであるため、ここでの問題はキャッシュ ミスに関するものだと思います。私は正しいですか?教えてください、どんな助けでも大歓迎です。:)