【问题标题】:Can't read float array into __m128无法将浮点数组读入 __m128
【发布时间】:2013-05-22 14:43:39
【问题描述】:

我正在摆弄矢量化(第一次学习)。它的重点是看看我是否可以展开循环。我喜欢像这样加载四个连续的浮点数,请参阅 Seg 错误。

el0 = _mm_load_ps(&array[0]);
el1 = _mm_load_ps(&array[1]);   // Seg fault

我明白为什么会出现 seg 错误。我的问题是,有没有一种巧妙的 _mm_loading 方法?

【问题讨论】:

  • 您可能正在寻找未对齐的load intrinsics。尤其是_mm_loadu_ps()
  • 假设数组的类型是float[],您可能还想跨过数组4个元素,而不是1个元素。
  • Jason - 就像我说的那样,重点是展开循环,即步幅大于 1 个元素。这里的计划是看看我是否可以加快一些 foo() 计算。我想使用的数组元素是array[i]、array[i+1]和array[i+2],或者更具体地说,是从i、i+1和i+2开始的四个元素。神秘 - 我想我可以通过修补您链接的功能来解决问题。谢谢!
  • 请提供完整的源代码。

标签: c load offset sse vectorization


【解决方案1】:

评论者已经解决了它,但是当问题出现在未回答的问题列表中时,这很烦人。

_mm_load_ps(&array[0])   // load a vector of array[0..3]
_mm_load_ps(&array[1])   // load a vector of array[1..4].  different alignment than array[0]

// what you probably want is:
_mm_load_ps(&array[4])   // load a vector of array[4..7], aligned if array is aligned

索引步长应该是sizeof(vector_type)/sizeof(array[0])。 (然后,当您扩展 AVX 代码时,您不必更改索引。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多