首页 文章

卸载到MIC(Xeon Phi)错误,迭代加载的数组

提问于
浏览
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上的过程有关 . 有任何想法吗?

谢谢!

1 回答

  • 0

    过了一段时间,我找到了问题的答案 .

    • 首先需要对齐数据结构 . 如果没有,它将返回错误 . 卸载错误并不意味着错误是在将内存从主机CPU复制到协处理器的过程中引起的,它可能在代码中的任何位置引起 .

    • 其次,如果你有未对齐的内存并且不能/不想对齐它,你可以在卸载期间使用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)
    

    现在复制的内存将被复制 aligned .

相关问题