1

マルチスレッドプログラミングは初めてです。最近、私は 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 演算されます、など)。 ...)。これらの省略された部分は、個々の実行ごとにランダムであるため、ここでの問題はキャッシュ ミスに関するものだと思います。私は正しいですか?教えてください、どんな助けでも大歓迎です。:)

4

1 に答える 1