c - 使用 SSE 进行矩阵乘法错误 __m128 到 *float 转换?

标签 c matrix sse

我正在尝试使用 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++;
            }
        }
    }
}

最佳答案

我假设它是 __m128 *m3 = (__m128*)a[i]; 并且后面的行会产生错误。您正在尝试将 float 类型转换为指向 __m128 的指针,编译器应该提示这一点。

我不知道预期算法的细节。假设目的是将四个 float 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);

关于c - 使用 SSE 进行矩阵乘法错误 __m128 到 *float 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23159986/

相关文章:

c - 为指针赋值导致硬故障

c - 为什么 getppid 和 getpid 返回相同的值

c - 非常基本的 C 问题

计算写入文件的矩阵的元素总数

c++ - cat(3,A,B) Matlab 函数。相当于 opencv3 (c++)

sse - SIMD 行列式计算

c++ - 启用 arch :SSE2 makes program slower

c - 递归不按预期工作

c - 打印出 double 矩阵

c - Intel x86 SSE SIMD 指令入门