我正在开发一个 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/