我想移植现有的C ++代码,该代码已针对使用GNU编译器运行矢量操作进行了优化,以与Visual Studio编译器一起编译。
本程序使用专门的GNU单指令多数据(SIMD)内部指令(请参阅例如GCC-矢量扩展)。
由于这些内在函数似乎仅是GNU编译器,如果有人知道是否有一种方法可以移植数据类型和函数以与其他编译器一起使用(在我的情况下为msvc12),我将非常高兴。
基本上有两个但非常相关的问题。1.是否可以类似的方式为其他编译器构造以下数据类型?(这些是16个字节的变量,例如包含4int
或16个变量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)));
在哪里可以找到以下功能的描述和与编译器无关的等效内容?
__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
是否可以“简单地”替换typedef
s和__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
内联函数可能比上述define
s更优雅。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句