GNU __builtin_ia32函数(对于Visual Studio编译器)是否具有等效项?

马库斯

我想移植现有的C ++代码,该代码已针对使用GNU编译器运行矢量操作进行了优化,以与Visual Studio编译器一起编译。

本程序使用专门的GNU单指令多数据(SIMD)内部指令(请参阅例如GCC-矢量扩展)。

由于这些内在函数似乎仅是GNU编译器,如果有人知道是否有一种方法可以移植数据类型和函数以与其他编译器一起使用(在我的情况下为msvc12),我将非常高兴。

基本上有两个但非常相关的问题。1.是否可以类似的方式为其他编译器构造以下数据类型?(这些是16个字节的变量,例如包含4int16个变量char。)

   // Integer types
   typedef char     v16qi __attribute__ ((vector_size (16), aligned (16)));
   typedef short     v8hi __attribute__ ((vector_size (16), aligned (16)));
   typedef int       v4si __attribute__ ((vector_size (16), aligned (16)));
   typedef long long v2di __attribute__ ((vector_size (16), aligned (16)));

   // Floating point types
   typedef float     v4sf __attribute__ ((vector_size (16), aligned (16)));
   typedef double    v2sf __attribute__ ((vector_size (16), aligned (16)));
  1. 在哪里可以找到以下功能的描述和与编译器无关的等效内容?

    __builtin_ia32_loaddqu,__builtin_ia32_paddsb128,__builtin_ia32_paddusb128,__builtin_ia32_pavgb128,__builtin_ia32_pcmpgtb128,__builtin_ia32_pmovmskb128,__builtin_ia32_psadbw128,__builtin_ia32_psrlwi128,__builtin_ia32_psubsb128,__builtin_ia32_psubusb128,__builtin_ia32_punpckhbw128,__builtin_ia32_pxor128,__builtin_ia32_storedqu

我已经在集中搜索该主题,但是找不到我的问题的直接答案。我知道存在与msvc12一起使用的数据类型,例如(例如__m128请参阅Microsoft开发人员网络-SIMD流扩展(SSE)),但是我无法将两者结合在一起。__m128i__m128d

是否可以“简单地”替换typedefs和__builtin_ia32函数?

如果我在任何细节上都更具体,请发表评论。我试图使问题简短。我将非常感谢您的帮助!预先非常感谢您的回答。

马库斯

我可以避免代码中的某些功能。对于其余的内容,以下内容对我有用(我终于可以emmintrin.h在MinGW gcc编译器的include目录中找到相应的函数以及类似文件中的内容),并与Agner Fog的vectorclass库结合使用,@ PeterCordes对此进行了评论(谢谢您)您的帮助)。

#ifdef _MSC_VER
#define __builtin_ia32_psadbw128(_A, _B)  _mm_sad_epu8((__m128i) _A, (__m128i) _B)
#define __builtin_ia32_paddsb128(_A, _B)  _mm_adds_epi8((__m128i) _A, (__m128i) _B)
#define __builtin_ia32_pmovmskb128(_A)    _mm_movemask_epi8((__m128i) _A)
#define __builtin_ia32_pcmpgtb128(_A, _B) _mm_cmpgt_epi8((__m128i) _A, (__m128i) _B)
#define __builtin_ia32_psubsb128(_A, _B)  _mm_subs_epi8((__m128i) _A, (__m128i) _B)
#define __builtin_ia32_psubusb128(_A, _B) _mm_subs_epu8((__m128i) _A, (__m128i) _B)
#define __builtin_ia32_pavgb128(_A, _B)   _mm_avg_epu8((__m128i) _A, (__m128i) _B)
#define __builtin_ia32_paddusb128(_A, _B) _mm_adds_epu8((__m128i) _A, (__m128i) _B)
#define __builtin_ia32_psrlwi128(_A, _B)  _mm_srli_epi16((__m128i) _A, _B)
#define __builtin_popcountll(_X)          _mm_popcnt_u64((unsigned long long) _X)
#endif

内联函数可能比上述defines更优雅

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有与Visual Studio C ++编译器等效的-ffast-math标志

Typescript编译器是否具有@inline函数选项?

在tmux中是否有GNU Screen的“ log”命令的等效项?

覆盖弱函数时如何设置编译器警告(GNU GCC)

为什么编译器将GCC中的嵌套函数(GNU扩展)的地址视为“非常数”?

构建ARM GNU Cross编译器

降级GNU编译器Ubuntu 18.04

GNU GCC 编译器 - 对齐属性

在Mac上的gnu / clang编译器中定义相对于可执行文件的框架路径

Visual Studio中的代码块中是否有类似于编译器标志的模拟物?

具有函数调用的变量作为GNU Make中的依赖项

CLANG vs. GNU编译器集合-在GNU中编译,但在CLANG中失败

GNU C ++编译器((GCC)5.2.0)本身是否擅长“内联”?

GCJ(Java的GNU编译器)是否是发布Web应用程序的可行工具?

GNU的Java编译器(GCJ)死了吗?

GNU C编译器破坏未定义的行为

GNU g ++编译器下main()的返回类型

什么是-D编译器标志C ++(clang,GNU,MSVC)

无法扩展某些宏(GNU99编译器)

_mm512_exp_pd与GNU编译器

是否有不需要C ++编译器(Microsoft Visual Studio)的Node.JS的Oracle驱动程序?

如何使用GNU Octave函数链接和编译C ++代码?

编译器如何确定具有编译器临时生成的函数所需的堆栈大小?

GNU FORTH是否有编辑器?

GNU是否与for循环并行?

是否有C ++编译器选项可允许主动删除所有函数调用并将参数传递给具有空主体的函数?

GNU汇编器,使用堆栈的函数调用,seg错误

适用于Linux的Windows子系统上的GNU Fortran编译器-将内部函数传递给另一个过程的分段错误

GNU GASM (x86_32) 跨函数保留寄存器值 (jmp)