c - 尝试开始使用 SIMD 指令,但在 C 中遇到错误 (0xC0000005)

标签 c cpu

我正在尝试学习使用 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/

相关文章:

memory-management - 兆字 (MW) 是什么意思?

cpu - echo $$>尝试使用cpuset时,任务会给出 "no space left on device"

c - 优化函数进入/退出 (gcc)

将 float 转换为相应的整数

c - 使用 C 从数组中提取特定数字

operating-system - 'process preemption' 的确切定义是什么?

c - linux模块互函数引用

c - memcpy c 中的 3d 指针

c++ - 如何检测运行时正在使用哪个 CPU?

algorithm - n 位 cpu 上的 n/2 位乘法