c - 如何从C代码中获取SIMD代码

标签 c simd

我正在开发一个 m/c Intel(R) Xeon(R) CPU E5-2640 v2 @ 2.00GHz 它支持 SSE4.2。

我编写了 C 代码来对字符串位执行异或运算。但我想编写相应的SIMD代码并检查性能改进。这是我的代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

#define LENGTH 10

unsigned char xor_val[LENGTH];

void oper_xor(unsigned char *r1, unsigned char *r2)
{
    unsigned int i;
    for (i = 0; i < LENGTH; ++i)
    {
        xor_val[i] = (unsigned char)(r1[i] ^ r2[i]);
    printf("%d",xor_val[i]);
    }
}

int main() {

    int i;
    time_t start, stop;
    double cur_time;
    start = clock();
    oper_xor("1110001111", "0000110011");
    stop = clock();
    cur_time = ((double) stop-start) / CLOCKS_PER_SEC;

    printf("Time used %f seconds.\n", cur_time / 100);
    for (i = 0; i < LENGTH; ++i)
        printf("%d",xor_val[i]);
    printf("\n");
    return 0;
}

在编译和运行示例代码时,我得到如下所示的输出。这里的时间是00,但在实际项目中它消耗了足够的时间。

gcc xor_scalar.c -o xor_scalar
pan88: ./xor_scalar
1110111100 Time used 0.000000 seconds.
1110111100

如何开始为SSE4.2编写相应的SIMD代码

最佳答案

英特尔编译器和任何 OpenMP 编译器分别支持 #pragma simd#pragma omp simd。这些是让编译器为您执行 SIMD 代码生成的最佳选择。如果失败,您可以使用内部函数,或者作为最后的手段,使用内联汇编。

请注意,printf 函数调用几乎肯定会干扰矢量化,因此您应该将它们从任何要查看 SIMD 的循环中删除。

关于c - 如何从C代码中获取SIMD代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31910561/

相关文章:

c - 如何使用 Fiddle 和 Windows API (dll) 在 Ruby 中运行 shellcode

c - 如何将AVX2 vector 水平3乘3添加?

c++ - 使用 SSE 的 OpenCV 灰度图像的平方根

c - 我如何只交换一个而不是两个值?

c - 在 C 中使用动态数组分配动态结构数组

c - 这个结构叫什么?简单的 SoA?

simd - 使用 AVX-512 模拟 64 字节的移位

SIMD (AVX2) - 将 uint8_t 值加载到多个 float __m256 寄存器

c - c中的翻转位

c - 为什么会有不同的答案?