zoukankan      html  css  js  c++  java
  • 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,=、=!)

     

  • 相关阅读:
    C++设计模式-Bridge桥接模式
    解决VS2010打开Web页面时经常由于内存较低而导致VS2010自动关闭的问题
    Js继承小结
    MAC上的包管理利器
    Objective-C的hook方案(一): Method Swizzling
    OleContainer操作Excel以二进制方式读写数据库
    复制文件时,如何显示进度条(使用TFileStream一点一点读,或者使用BlockRead,并插入application.ProcessMessages)
    ADO异步查询显示进度条
    D2010 RTTI + Attribute 简单实现ORM
    Delphi默认窗体随想
  • 原文地址:https://www.cnblogs.com/wangpei0522/p/4271005.html
Copyright © 2011-2022 走看看