2016-05-05 8 views
0

MICにデータ構造をオフロードするときに問題が発生します。私は、次のディレクティブをMICにオフロードしていますMIC(Xeon Phi)にロードされたエラーがロードされたアレイを反復するエラー

#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にコピーするプロセスと関係していると思います。何か案は?

ありがとうございます!

答えて

0

しばらくすると、私の質問に対する答えが見つかりました。

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

  • 第二に、あなたは、アラインされていないメモリを持っており、/あなたはこのようなオフロードの間に整列修飾子を使用することができ、それを揃えたくていけないことができない場合:

    #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) 
    

今コピーしたメモリがをコピーされます整列

関連する問題