c++ - 使用 _mm_load_pd 时函数崩溃

标签 c++ segmentation-fault sse intrinsics

我有以下功能:

template <typename T>
void SSE_vectormult(T * A, T * B, int size)
{

    __m128d a;
    __m128d b;
    __m128d c;
    double A2[2], B2[2], C[2];
    const double * A2ptr, * B2ptr;
    A2ptr = &A2[0];
    B2ptr = &B2[0];
    a = _mm_load_pd(A);
    for(int i = 0; i < size; i+=2)
    {
        std::cout << "In SSE_vectormult: i is: " << i << '\n';
        A2[0] = A[i];
        B2[0] = B[i];
        A2[1] = A[i+1];
        B2[1] = B[i+1];
        std::cout << "Values from A and B written to A2 and B2\n";
        a = _mm_load_pd(A2ptr);
        b = _mm_load_pd(B2ptr);
        std::cout << "Values converted to a and b\n";
        c = _mm_mul_pd(a,b);
        _mm_store_pd(C, c);
        A[i] = C[0];
        A[i+1] = C[1];
    };
//    const int mask = 0xf1;
//    __m128d res = _mm_dp_pd(a,b,mask);
//    r1 = _mm_mul_pd(a, b);
//    r2 = _mm_hadd_pd(r1, r1);
//    c = _mm_hadd_pd(r2, r2);
//    c = _mm_scale_pd(a, b);
//    _mm_store_pd(A, c);
}

当我在 Linux 上调用它时,一切都很好,但是当我在 Windows 操作系统上调用它时,我的程序崩溃并显示“程序不再工作”。我做错了什么,我如何确定我的错误?

最佳答案

不保证您的数据按照 SSE 加载要求进行 16 字节对齐。要么使用 _mm_loadu_pd:

    a = _mm_loadu_pd(A);
    ...
    a = _mm_loadu_pd(A2ptr);
    b = _mm_loadu_pd(B2ptr);

或确保您的数据尽可能正确对齐,例如对于静态或局部变量:

alignas(16) double A2[2], B2[2], C[2];    // C++11, or C11 with <stdalign.h>

或者不使用 C++11,使用特定于编译器的语言扩展:

 __attribute__ ((aligned(16))) double A2[2], B2[2], C[2];   // gcc/clang/ICC/et al

__declspec (align(16))         double A2[2], B2[2], C[2];   // MSVC

您可以使用 #ifdef#define 一个适用于目标编译器的 ALIGN(x) 宏。

关于c++ - 使用 _mm_load_pd 时函数崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20411887/

相关文章:

assembly - 学习 SSE/SSE2 和 asm 优化

c++ - 从 SQLite 中的准备语句获取原始 SQL 查询

c++ - Uniform_real 不接受 numeric_limits::lowest()

c++:PThread 调度与 Windows 线程

c - 矩阵排序段错误

c++ - 在类构造函数问题中从文件加载失败

c - 解决访问冲突

c++ - 我是否需要重载类的强制转换运算符?

assembly - 为什么SSE中的AES没有提供完整的功能?

c++ - 高斯模糊的SSE优化