offload语句中使用#ifdef __MIC__ 可能发生的隐式错误

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

Kevin Davis 提到的方法其实并不可取,最好的办法就是不要在#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);

#else

  return v1;

#endif

}

下面是我找到的资料:

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

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

时间: 2024-12-19 12:25:47

offload语句中使用#ifdef __MIC__ 可能发生的隐式错误的相关文章

Qt C++中的关键字explicit——防止隐式转换(也就是Java里的装箱),必须写清楚

最近在复习QT,准备做项目了,QT Creator 默认生成的代码 explicit Dialog(QWidget *parent = 0)中,有这么一个关键字explicit,用来修饰构造函数.以前在Windows下写程序的时候,基本上没有碰到这个关键字,那么这个关键字是做什么用的呢? 关键字 explicit 可以禁止“单参数构造函数”被用于自动类型转换,主要用于 "修饰 "构造函数. 指明构造函数只能显示使用,目的是为了防止不必要的隐式转化. 光看这一句似乎不太容易明白,下面,举

C#中的自动属性、隐式类型var、对象初始化器与集合初始化器、扩展方法

1.自动属性(Auto-Implemented Properties) //以前的写法 .net2.0 private string _userName; public string UserName { get { return _userName; } set { _userName= value; } } //现在 只适合3.5以上 public string_userName {get;set;} 2.隐式类型var 它是在编译已经能确定变量的类型,是根据后面的值自动推断类型,编译时把推

java中jsp的九大隐式对象及web四大域

JSP运行原理和九大隐式对象 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用. 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响. JSP引擎在调用JSP对应的_jspServlet时,会传

Android-----Intent中通过startActivity(Intent intent )隐式启动新的Activity

显式Intent我已经简单使用过了,也介绍过概念,现在来说一说隐式Intent: 隐式Intent:就是只在Intent中设置要进行的动作,可以用setAction()和setData()来填入要执行的动作和数据,然后再用startActivity()启动合适的程序. 此外:如果手机中有多个适合的程序,还会弹出列表供用户选择(假如你手机有两个浏览器,你打开一个连接,这是系统就会弹出两个浏览器列表供你选择) 在此举个使用隐式Intent打开activity的快速拨号例子: xml布局文件代码如下:

Android中的显示Intent和隐式Intent

1.显示Intent 在onclick方法中 Intent intent=new Intent(FirstActivity.this,SecondActivity.class); startActivity(intent); 2.隐式Intent 隐式Intent不明确指出我们要启动哪一个活动,而是指定一系列更为抽象的action和category等信息,然后交由系统去分析这个intent,并帮我们找到合适的Intent去启动 通过标签下配置的内容,指定当前活动能够响应的action和categ

JavaScript中valueOf、toString的隐式调用

今天在群上有人问这样一个问题: 函数add可以实现连续的加法运算函数add语法如下add(num1)(num2)(num3)...;//注意这里是省略号哟,无限使用举例如下:add(10)(10)=20;add(10)(20)(50)=80;add(10)(20)(50)(100)=180;请用js代码实现函数add. 自个琢磨了一会只能Google之,代码如下: function add(num){ var sum=num, tmp=function(v){ sum+=v; return tm

解决Html.CheckBoxFor中”无法将类型 bool 隐式转换为 bool。存在一个显式转换..."的方法

在后面加.Value属性 @Html.CheckBoxFor(m => m.IsComment.Value, new { style = "vertical-align: middle;" })

Scala 中的隐式转换 implicit

Scala语言中的隐式转换是一个十分强大的语言特性,主要可以起到两个作用: 一.自动进行某些数据类型的隐式转换 String类型是不能自动转换为Int类型的,所以当给一个Int类型的变量或常量赋予String类型的值时编译器将报错.所以,一下语句是错误的. val x: Int = "100" 如果需要将一个字符串类型的整形数值赋给Int,比如使用String.toInt方法,例如: v al x: Int = "100".toInt 如果想让字符串自动转换为整形,

F#中的隐式转换

我们知道隐式变换在可控情况下会使代码变得简洁.熟悉C#的都知道C#中可以自定义隐式变换,例如 public class A { private int data; public static implicit operator A(int i) { return new A{ data = i}; } } 众所周知,F#本身不会进行任何隐式变换.那F#中是否也可以自定义隐式变换呢? 当然可以.通过定义自己的操作符即可实现. 我们先定义一个转换操作符 let inline (!>) (x:^a)