SSE:从 const __m128 * 转换为 const float *

Posted

技术标签:

【中文标题】SSE:从 const __m128 * 转换为 const float *【英文标题】:SSE: convert from const __m128 * to 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));

【问题讨论】:

【参考方案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。

以上是关于SSE:从 const __m128 * 转换为 const float *的主要内容,如果未能解决你的问题,请参考以下文章

SSE 从 __m128 中提取整数用于索引数组

AVX/SSE 将浮点符号掩码转换为 __m128i

如何使用 SSE 将 _m128i 转换为无符号整数?

SSE 比较内在 - 如何从比较中获得 1 或 0?

__m128, SSE4 中最大绝对值的符号

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