GNU __builtin_ia32 函数(对于 Visual Studio 编译器)是否有等价物?
Are there equivalents for the GNU __builtin_ia32 functions (for the Visual Studio Compiler)?
我想移植已针对 运行 向量操作优化的现有 C++ 代码,使用 GNU 编译器以使用 Visual Studio 编译器进行编译。
该程序使用专门的 GNU 单指令多数据 (SIMD) 内部指令(参见 GCC - Vector Extensions)。
由于这些内在函数似乎仅适用于 GNU 编译器,如果有人知道是否有一种方法可以移植数据类型和函数以与其他编译器(在我的例子中为 msvc12)一起工作,我将非常高兴。
基本上有两个但非常密切相关的问题。
1. 是否可以为其他编译器以类似的方式构造以下数据类型? (这些是 16 字节变量,例如包含四个 int
或十六个 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
、__m128i
和 __m128d
(参见 Microsoft Developer Network - Streaming SIMD Extensions (SSE)),但我无法将两者结合在一起。
是否可以 "simply" 替换 typedef
和 __builtin_ia32
函数?
如果我应该更具体地说明任何细节,请发表评论。我试图让问题简短。
如果有任何帮助,我将不胜感激!非常感谢您的回答。
我可以避免代码中的一些功能。对于其余部分,以下为我完成了工作(我最终可以在 emmintrin.h
中识别相应的函数,并在 MinGW gcc 编译器的 include 目录中找到类似的文件),并通过 Agner Fog 结合向量类库@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 更优雅。
我想移植已针对 运行 向量操作优化的现有 C++ 代码,使用 GNU 编译器以使用 Visual Studio 编译器进行编译。
该程序使用专门的 GNU 单指令多数据 (SIMD) 内部指令(参见 GCC - Vector Extensions)。
由于这些内在函数似乎仅适用于 GNU 编译器,如果有人知道是否有一种方法可以移植数据类型和函数以与其他编译器(在我的例子中为 msvc12)一起工作,我将非常高兴。
基本上有两个但非常密切相关的问题。
1. 是否可以为其他编译器以类似的方式构造以下数据类型? (这些是 16 字节变量,例如包含四个 int
或十六个 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
、__m128i
和 __m128d
(参见 Microsoft Developer Network - Streaming SIMD Extensions (SSE)),但我无法将两者结合在一起。
是否可以 "simply" 替换 typedef
和 __builtin_ia32
函数?
如果我应该更具体地说明任何细节,请发表评论。我试图让问题简短。 如果有任何帮助,我将不胜感激!非常感谢您的回答。
我可以避免代码中的一些功能。对于其余部分,以下为我完成了工作(我最终可以在 emmintrin.h
中识别相应的函数,并在 MinGW gcc 编译器的 include 目录中找到类似的文件),并通过 Agner Fog 结合向量类库@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 更优雅。