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

标签 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);

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

最佳答案

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

关于c - 如何使用整数除法 SSE 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49440810/

相关文章:

c - 在 C 中使用 for 循环打印值时输出错误

linux - 如何在进程中配置和采样英特尔性能计数器

c++ - 可以通过使用输入寄存器来寻址输出 SIMD 寄存器

optimization - 改进 SSE (SSSE3) YUV 转 RGB 代码

c++ - MMX 与 SSE2 性能比较

C free() 链表中的内存

c - 如何使用 malloc 从函数返回 char 数组

assembly - 如何将负整数转换为字符串并在 MASM Assembly 中输出

x86 - x87 相对于 SSE 的优势

c - Linux 上的侧线程上的 malloc/calloc 崩溃