0

一部のデータ構造を MIC にオフロードするときに問題が発生します。

次のディレクティブを使用して MIC にオフロードしています。

    #pragma offload target(mic:mic_no)\
    inout(is_selected : length(query_sequences_count)ALLOC)\
    in(a:length(a_size) ALLOC)\
    in(a_disp:length(offload_db_count)ALLOC)

ただし、オフロードされた領域内で実行しようとすると:

//loads next 64 characters of a into datadb
__m512i datadb __attribute__ ((aligned(64)));
datadb = _mm512_load_epi32(a+iter_db+a_disp[j]);

これにより、次のエラーが発生します。

Offload error:process on the device 0 was terminated by signal 11(SIGSEGV)

しかし、代わりに a の内容を次のように別の配列にコピーすると:

char db[64];
for(window_db_iter = 0; window_db_iter < 64; window_db_iter++)
    db[window_db_iter] = *(a+iter_db+a_disp[j]+window_db_iter);

//Now this works fine
datadb = _mm512_load_epi32(db);

a_size が a のサイズであり、a_disp も正しいことを確認しました。またa+iter_db+a_disp[j]、常にメモリの範囲内にとどまります。私の推測では、メモリを MIC にコピーするプロセスに関係していると思われます。何か案は?

ありがとう!

4

1 に答える 1

0

しばらくして、私は自分の質問に対する答えを見つけました。

  • まず、データ構造を整列する必要があります。そうでない場合は、エラーが返されます。オフロード エラーは、ホスト CPU からコプロセッサにメモリをコピーするプロセス中にエラーが発生したことを意味するのではなく、コード内のどこでも発生する可能性があります。

  • 第 2 に、整列されていないメモリがあり、それを整列できない/したくない場合は、次のようにオフロード中に align 修飾子を使用できます。

    #pragma offload target(mic:mic_no)\
    inout(is_selected : length(query_sequences_count)ALLOC)\
    in(a[0:a_size]: aligned(64) ALLOC)\
    in(a_disp:length(offload_db_count)ALLOC)
    

これで、コピーされたメモリが整列してコピーされます。

于 2016-06-07T19:53:04.460 に答える