如何从C代码

时间:2015-08-10 01:41:10

标签: c simd

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

我编写了C代码来对字符串位执行XOR操作。但我想编写相应的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代码

1 个答案:

答案 0 :(得分:4)

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

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