c - 卸载到 MIC (Xeon Phi) 时迭代加载的阵列时出错

标签 c icc xeon-phi offloading

我在将某些数据结构卸载到 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 卸载的长度是否正确,a_size 是 a 的大小,并且 a_disp 也是正确的。此外,a+iter_db+a_disp[j] 始终保持在内存范围内。我的猜测是,这与将内存复制到 MIC 的过程有关。有什么想法吗?

谢谢!

最佳答案

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

  • 首先需要对齐数据结构。如果不是,它将返回一个错误。 Offload错误并不意味着错误是在将内存从主机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)
    

现在复制的内存将被对齐复制。

关于c - 卸载到 MIC (Xeon Phi) 时迭代加载的阵列时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37052171/

相关文章:

c - 如何使用 strcpy 将字符串和用户输入放入新字符串中?

c++ - 英特尔 C++ 优化器删除了 masm 代码

c - 至强融核 : slower performance with padding

c - 在不相关的进程之间设置IPC

c - 哪个头文件加载 Win32 api 中的 DLL?

二维数组 `memset` 上的困惑和 `free` 上的错误

optimization - 有效使用英特尔编译器 SVML `__m128 _mm_sincos_ps ()`

c++ - 来自另一个非静态的非静态成员初始值设定项

opencl - 适用于 Xeon Phi 的最新 OpenCL 驱动程序