我正在尝试学习使用 C 语言中的 SIMD 指令。我决定开始使用 SSE。我使用的是 Windows 8.1,并在 Windows 环境中使用 Codeblocks 进行编码。我的 CodeBlocks 设置设置为使用 Intel i7(我有),因此启用了 SSE。我的程序编译得很好,但是一旦运行时出现错误。错误为“(0xC0000005)”。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <xmmintrin.h>
float ScalarSSE(float *m1, float *m2) {
float prod;
int i;
__m128 X, Y, Z;
for(i=0; i<5; i+=4) {
X = _mm_load_ps(&*m1);
Y = _mm_load_ps(&*m2);
X = _mm_mul_ps(X, Y);
Z = _mm_add_ps(X, Z);
}
for(i=0; i<4; i++) {
prod += Z[i];
}
return prod;
}
int main() {
int i;
float *s1 = calloc(1,sizeof (float));
float *s2 = calloc(1,sizeof (float));
for(i=0; i<100; i++) {
*s1 = 2;
*s2 = 2;
float scalar_product_sse = ScalarSSE(s1, s2);
}
printf("Done");
free (s1);
free (s2);
}
我无法使用 Debug模式,因为我不在项目中,也不知道如何在 CodeBlocks 中打开项目(它给了我错误:( )
我想知道如何使这项工作没有任何错误。谢谢!
最佳答案
在这里,您为一个 float 分配空间:
float *s1 = calloc(1,sizeof (float));
然后您将在 ScalarSSE 中访问多个 float
也许这样的东西会有所帮助,尽管确定要使用的确切数字会更好:
float *s1 = calloc(100,sizeof (float));
float *s2 = calloc(100,sizeof (float));
另外:
for(i=0; i<100; i++) {
*s1 = 2;
*s2 = 2;
float scalar_product_sse = ScalarSSE(s1, s2);
}
这会做同样的事情 100 次 - 这就是你想要的吗?
“(0xC0000005)”表示“访问冲突”——基本上,您尝试访问不允许触摸(或不存在)的内存
关于c - 尝试开始使用 SIMD 指令,但在 C 中遇到错误 (0xC0000005),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220471/