【问题标题】:SSE: convert from const __m128 * to const float *SSE:从 const __m128 * 转换为 const float *
【发布时间】:2013-05-30 03:05:26
【问题描述】:

我正在尝试编写一些 SSE 代码,但由于此错误而无法继续:

错误 C2664:“_mm_loadu_ps”:无法将参数 1 从“const __m128 *”转换为“const float *”

我必须加载未对齐的数据并转换为 __m128 才能使用 SSE 内在函数。 我正在网上搜索,但无法完成这项工作。 这是我的代码:

const Matrix<T> mul_SSE (const Matrix<T>& m)const{
    // ...
    __m128 a = _mm_loadu_ps((__m128 const*)&m(0,0)); //<-Here's the error line
    // ...
}

参数 m 是一个浮点矩阵。 有什么建议吗?非常感谢!

ps。另外,如果我写 __m128 a = _mm_loadu_ps((__m128*)&amp;m(0,0)); 它会给我同样的错误:

错误 C2664:“_mm_loadu_ps”:无法将参数 1 从“__m128 *”转换为“const float *”

已解决: 正确的方法:

__m128 a = _mm_loadu_ps(&m(0,0));

【问题讨论】:

    标签: c++ floating-point type-conversion constants sse


    【解决方案1】:

    The documentation on MSDN states that _mm_loadu_ps takes a float* with 4 floats.

    您需要传入一个 float* 指向矩阵中浮点数的数组(实际上是 4 个)。

    当函数需要 float* 时,您将对矩阵的引用转换为 __m128 const*

    【讨论】:

    • 首先我使用了 __m128 a = _mm_loadu_ps((__m128*)&m(0,0));但它给了我同样的错误(无法将参数 1 从 '__m128 *' 转换为 'const float *')..因为我在 __m128 之前添加了 const ...
    • 您不应该转换为__m128*,而是转换为float*。 (假设您的 Matrix 的成员被方便地订购:v)。您可能应该使用矩阵中的数据手动构建一个 float* 。分配 16 字节的内存并按顺序将浮点数写入该空间。
    • 感谢您的回答!它让我意识到,就像你说的,我不需要转换我的数据。事实上,我正在读取一个不是 16 字节对齐的地址。现在以这种方式工作:__m128 a = _mm_loadu_ps(&m(0,0));谢谢!时间不早了,视线有些模糊。
    • 您想使用对齐的内存。它在性能上有很大的不同。只需使用 _mm_malloc。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多