使用 SSE 错误 __m128 到 *float 转换的矩阵乘法?

Posted

技术标签:

【中文标题】使用 SSE 错误 __m128 到 *float 转换的矩阵乘法?【英文标题】:Matrix Multiplication Using SSE Error __m128 to *float conversion? 【发布时间】:2014-04-18 18:28:15 【问题描述】:

我正在尝试使用 SSE Intrinsic 对矩阵乘法进行编程。我不确定我的代码是否正确,也无法编译它,因为我收到错误:

Error   1   error C2440: 'type cast' : cannot convert from 'float' to '__m128 *

有人可以仔细检查我的程序以确保我的矩阵乘法正确吗?另请注意,这是针对方阵的。

这是我的代码。

void Intrinsics (float * matrix_a, float * matrix_b, float * matrix_result, const int num_row, const int num_col) 
    __declspec(align(16)) float * a = matrix_a;
    __declspec(align(16)) float * b = matrix_b;
    __declspec(align(16)) float * c = matrix_result;

    for(int i = 0; i < num_row; ++i)
    
       for(int j = 0; j < num_col; ++j)
        
            __m128 *m3 = (__m128*)a[i];     // The error is here.
            __m128 *m4 = (__m128*)b[j];
            float* res;
            *(c + (j * num_col + i)) = 0;
          for(int k = 0; k < num_col; k += 4)
            
                __m128 m5 = _mm_mul_ps(*m3,*m4);
                res = (float*)&m5;
                *(c + (j * num_col + i)) += res[0]+res[1]+res[2]+res[3];
                m3++;
                m4++;
            
        
    

【问题讨论】:

当代码行错误归因于? 用错误行更新代码 【参考方案1】:

我假设它是__m128 *m3 = (__m128*)a[i]; 和之后的行会产生错误。您正在尝试将 float 类型转换为指向 __m128 的 指针,编译器可以抱怨该类型。

我不知道预期算法的细节。假设意图是访问四个浮点数 a[i]..a[i+3] 作为单个 __m128,你需要这样的东西:

__m128 *m3 = (__m128*)&a[i];
__m128 *m4 = (__m128*)&b[j];

或同等学历:

__m128 *m3 = (__m128*)(a + i);
__m128 *m4 = (__m128*)(b + j);

【讨论】:

您不应直接访问 __m128 字段。但是,您可以在调试器中查看这些类型。 __m128 类型的变量映射到 XMM[0-7] 寄存器。 _m128 类型的变量在 16 字节边界上自动对齐。 我们在这里处理语法错误——尝试将浮点数分配给指针。用户试图用他指向的数据做什么,是一个不同的问题,可能需要自己的问题。 :-)

以上是关于使用 SSE 错误 __m128 到 *float 转换的矩阵乘法?的主要内容,如果未能解决你的问题,请参考以下文章

c/c++ 代码中使用sse指令集加速

SSE 访问冲突

SSE 将整数加载到 __m128

SSE 加载/存储内存事务

尝试在 SSE 编程中使用和掩码添加 __m128

SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8