博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
offload语句中使用#ifdef __MIC__ 可能发生的隐式错误
阅读量:4340 次
发布时间:2019-06-07

本文共 1353 字,大约阅读时间需要 4 分钟。

intel xeon phi coprocessor 使用offload方式进行计算时,可以利用__MIC__的宏来条件编译代码,以区分在host cpu上的代码和在MIC协处理器上的代码。这对于那些只针对MIC才有的KNC指令特别有用。它的使用方式类似于:

#ifdef __MIC__

//do something on mic

#else

//do something on cpu

#endif

但是,__MIC__ 不能用在offload编译指令中:

#pragma offload target(mic:n)

{

//__MIC__不能用在这里

}

这是因为,在编译过程之前,会进行预处理,这个预处理的过程是将CPU端的数据传递给MIC协处理器会用到的offload数据,而预处理过程在

#ifdef __MIC__

#else

之间的内容,预处理器不可见,所以,传递给MIC的数据操作被略掉,这将发生未可知的错误,例如:offload error: unexpected number of variable descriptors

甚至,在宏之间本来应该发生的操作,并没有按照预想的执行。

解决方案就是:不要在offload编译指令中使用__MIC__宏!

——————————————————————————————————————————————————————————————————————————

最可怕的问题是silence error,没有之一,特别是在一个大程序中,这样的错误查无可查。这个问题困扰了我一天一夜,最后通过intel developer zone解决:

下面是我的提问:

https://software.intel.com/en-us/forums/topic/540140

 提到的方法其实并不可取,最好的办法就是不要在#pragma offload中使用__MIC__

如果你在#pragma offload语句中的KNC指令函数,在链接时遇见:undefined reference to "_mm512_extpackstorelo_epi32"这样的错误,可以用过这样的方式解决:

__forceinline __m512i PackStoreLo_epi32(const void*__restrict__ mt, __m512i& v1, _MM_DOWNCONV_EPI32_ENUM conv, int hint)

{

#ifdef __MIC__

return _mm512_extpackstorelo_epi32(mt,v1,conv,hint);

#ee

return v1;

#endif

}

下面是我找到的资料:

htt://software.intel.com/en-us/blogs/2013/03/27/painful-potential-problems-the-mic-macro-and-offload-code-blocks

(url中居然写着painful-potential-problems,=、=!)

  • 本文来自:

转载于:https://www.cnblogs.com/out8/p/4368109.html

你可能感兴趣的文章
Centos 修改主机名称
查看>>
实验室外包项目电路图中复位电路的错误 和 复位电路原理的学习
查看>>
批处理命令——for
查看>>
Swift基本常识点
查看>>
统计一个表中某个字符出现最多的字母.sql
查看>>
Sightseeing trip (POJ - 1734)
查看>>
【面向对象】一单元简单表达式求导总结
查看>>
事件处理程序
查看>>
msfvenom向apk注入payload
查看>>
高精度操作数值 BigDecimal类和BinInteger类
查看>>
uva784-迷宫探索
查看>>
delphi程序最小化任务栏控件 托盘
查看>>
2015年4月如玉
查看>>
oracle中的内连接、左外连接、右外连接、交叉连接、不等连接、自连接
查看>>
正则表达式简单语法以及常用正则表达式
查看>>
KMP
查看>>
Chapter 10 模版方法模式
查看>>
Ubuntu配置ISCSI
查看>>
Java——String类中的compareTo方法总结
查看>>
一道 JavaScript 面试题
查看>>