我正在使用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代码
答案 0 :(得分:4)
英特尔编译器和任何OpenMP编译器分别支持#pragma simd
和#pragma omp simd
。这些是让编译器为您执行SIMD codegen的最佳选择。如果失败,您可以使用内在函数,或者作为最后的手段,使用内联汇编。
请注意,printf
函数调用几乎肯定会干扰向量化,因此您应该从要查看SIMD的任何循环中删除它们。