如何使用整数除法SSE指令?

时间:2018-03-23 00:59:05

标签: c x86 sse simd intrinsics

根据参考here 应在" immintrin.h"

中定义以下功能
__m128i _mm_idiv_epi32 (__m128i a, __m128i b);
__m128i _mm_idivrem_epi32 (__m128i * mem_addr, __m128i a, __m128i b);
__m128i _mm_set_epi32 (int e3, int e2, int e1, int e0);

但根据我的测试计划,他们不是:

#include "immintrin.h"

int main() {
  __m128i a = _mm_set_epi32(4,3,2,1);
  __m128i b = _mm_set_epi32(1,2,3,4);
  __m128i c = _mm_idiv_epi32(a,b);
  __m128i d;

  c = _mm_idivrem_epi32(&d, a, b);
}

无法使用以下错误消息进行编译:

cc -g scratch.c && ./a.out
scratch.c: In function 'main':
scratch.c:11:15: warning: implicit declaration of function '_mm_idiv_epi32'; did you mean '_mm_rorv_epi32'? [-Wimplicit-function-declaration]
   __m128i c = _mm_idiv_epi32(a,b);
               ^~~~~~~~~~~~~~
               _mm_rorv_epi32
scratch.c:11:15: error: incompatible types when initializing type '__m128i {aka __vector(2) long long int}' using type 'int'
scratch.c:14:7: warning: implicit declaration of function '_mm_idivrem_epi32'; did you mean '_mm_movm_epi32'? [-Wimplicit-function-declaration]
   c = _mm_idivrem_epi32(&d, a, b);
       ^~~~~~~~~~~~~~~~~
       _mm_movm_epi32
scratch.c:14:5: error: incompatible types when assigning to type '__m128i {aka __vector(2) long long int}' from type 'int'
   c = _mm_idivrem_epi32(&d, a, b);

显然根本没有定义函数。那么我做错了什么呢?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您的代码可以使用最新版本的英特尔ICC编译器进行编译。 函数_mm_idiv_epi32是SVML指令。 SVML库与Intel ICC编译器捆绑在一起。如果您无权访问或不能使用ICC,获取可链接SVML的一种方法可能是安装并链接到OpenCL。