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*)&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 *的主要内容,如果未能解决你的问题,请参考以下文章