【问题标题】:random access aligned memory with SSE使用 SSE 的随机访问对齐内存
【发布时间】:2014-03-14 19:55:37
【问题描述】:

我尝试写入 int 数组中的随机位置。 为了确保我可以在随机位置访问内存,我尝试对齐整个内存块。

int * array = memalign(16384*2,16384*sizeof(short));

后来我在向量中这样写:

__m128i * index = (__m128i *) &array[RANDOMNUMBER];
_mm_store_si128(index+, ...) 

此指令导致访问错误。如果我使用_mm_storeu_si128 指令,我不明白。 有人可以解释一下为什么这不起作用吗?

【问题讨论】:

  • 尝试对齐写入位置。
  • 如何对齐写入位置?
  • _mm_store_si128( (index+RANDOMNUMBER) & ~(127), ...)
  • @erenon 谢谢你,但如果尝试写这个我得到一个错误。 “错误:'__m128i* {aka __vector(2) long long int*}'和'int'类型的无效操作数到二进制'operator&”。这个逻辑操作怎么对齐?

标签: c++ c sse simd


【解决方案1】:

_mm_store_si128 的参数必须是 16 字节对齐的。一个随机选择的 int 数组元素只会是 sizeof(int) 对齐的(即使数组本身是 16 字节对齐的)。因此,您必须确保数组的索引是(16/sizeof(int)) 的倍数,例如像这样:

__m128i * index = (__m128i *) &array[(RANDOMNUMBER / (16/sizeof(int))) * (16/sizeof(int))];

这将保证写入将正确对齐。这是否是您的代码真正需要做的事情是另一个问题......

【讨论】:

  • 谢谢。不,代码不是我想要存档的。我真的需要访问那个特定的位置。我希望这可行,因为一切都是对齐的。我想没有代码可以做我想做的事。所以我必须使用_mm_storeu_si128
  • 是的,如果你需要访问那个位置,你需要使用_mm_storeu_si128
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-07
  • 2011-06-25
  • 2013-10-21
  • 2017-01-08
  • 2017-04-18
  • 2012-03-15
相关资源
最近更新 更多