2

所以我试图做一个看起来像的数组操作

for (int i=0;i++i<32)
{
    output[offset+i] += input[i];
}

whereoutputinputfloat数组(由于 16 字节对齐malloc)。但是,我不能保证offset%4=0。我想知道如何解决这些对齐问题。

我虽然像

while (offset+c %4 != 0)
{
    c++;
    output[offset+c] += input[c];
}

后面跟着一个对齐的循环——显然这是行不通的,因为我们现在需要对input.

有没有办法矢量化我的原始循环?

4

1 回答 1

5

将评论移至答案:

对于未对齐的内存访问,有 SSE 指令。它们可以通过以下内在函数访问:

同样适用于所有double和整数类型。

因此,如果您不能保证对齐,那么这是最简单的方法。如果可能,理想的解决方案是从一开始就对齐阵列,这样您就可以完全避免这个问题。

未对齐的访问仍然会有性能损失,但它们是不可避免的,除非您采用极其混乱的移位/洗牌技巧(例如_mm_alignr_epi8())。

使用_mm_loadu_ps和的代码_mm_storeu_ps- 这实际上比 gcc 本身慢 50%

for (int j=0;j<8;j++)
{
    float* out = &output[offset+j*4];
    __m128 in = ((__m128*)input)[j]; //this is aligned so no need for _mm_loadu_ps
    __m128 res  = _mm_add_ps(in,_mm_loadu_ps(out)); //add values 
    _mm_storeu_ps(out,res); //store result
}
于 2012-04-24T03:24:46.297 回答