c++ - VS2013中SSE2代码运行报错

标签 c++ sse

我有以下 SIMD 代码试图在 vs2013 中运行。能编译好但不能运行。谁知道为什么?

#include <cstdio>
#include <xmmintrin.h>

int main() 
{
    const size_t num = 7;
    float a[num] = { 1, 2, 3, 4, 5, 6, 7 };
    float b[num] = { 1, -1, -2, 1, -3, -2, 5 };
    float c[num];
    __m128 A, B, C;
    A = _mm_load_ps(&a[0]); // <== crash here.
    B = _mm_load_ps(&b[0]);
    C = _mm_add_ps(A, B);
    _mm_store_ps(&c[0], C);

    return 0;
}

最佳答案

使用这些内在函数加载或存储的地址需要 16 字节对齐(可被 16 整除)。看 https://msdn.microsoft.com/en-us/library/zzd50xxt(v=vs.90).aspx

您应该像这样声明变量 a、b 和 c:

__declspec(align(16)) float a[num] = { 1, 2, 3, 4, 5, 6, 7 };

关于c++ - VS2013中SSE2代码运行报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37171116/

相关文章:

alignment - 为什么堆栈帧的长度是 16 字节的倍数?

c++ - 如何开始使用 Android Studio C++ 开发

c++ - Visual C++ - 显式调用基本类型的转换运算符

c++ - 使用 g++ 构建时如何抑制来自某些文件的警告?

rounding - 为什么 _mm_mulhrs_epi16() 总是偏舍入到正无穷大?

sse - XMM 寄存器值

arm - 常见的 SIMD 技术

c++ - C++中未定义的结构类型

c++ - 使用 std::future 和 std::async 的依赖项求解器

c - 如何对齐 16 位整数以用于 SSE 内在函数