卸载到 MIC (Xeon Phi) 错误迭代加载阵列
Offload into MIC (Xeon Phi) error iterating over loaded array
我在将一些数据结构卸载到我的 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 的过程有关。有什么想法吗?
谢谢!
一段时间后,我找到了问题的答案。
首先需要对齐数据结构。如果不是,它将 return 出错。 Offload错误并不意味着错误是在将内存从主机CPU复制到协处理器的过程中引起的,它可能是代码中的任何地方引起的。
其次,如果您有未对齐的内存并且 cannot/dont 想要对齐它,您可以在卸载期间使用对齐修饰符,如下所示:
#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)
现在复制的内存将被复制对齐。
我在将一些数据结构卸载到我的 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 的过程有关。有什么想法吗?
谢谢!
一段时间后,我找到了问题的答案。
首先需要对齐数据结构。如果不是,它将 return 出错。 Offload错误并不意味着错误是在将内存从主机CPU复制到协处理器的过程中引起的,它可能是代码中的任何地方引起的。
其次,如果您有未对齐的内存并且 cannot/dont 想要对齐它,您可以在卸载期间使用对齐修饰符,如下所示:
#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)
现在复制的内存将被复制对齐。