如何在没有对齐数组的情况下进行对齐添加

Joh*_*mer 2 c sse simd

所以我试图做一个类似的数组操作

for (int i=0;i++i<32)
{
    output[offset+i] += input[i];
}
Run Code Online (Sandbox Code Playgroud)

其中outputinputfloat数组(由于16位字节对齐malloc).但是,我无法保证这一点offset%4=0.我想知道如何解决这些对齐问题.

我有点像

while (offset+c %4 != 0)
{
    c++;
    output[offset+c] += input[c];
}
Run Code Online (Sandbox Code Playgroud)

然后是一个对齐的循环 - 显然这不起作用,因为我们现在需要一个未对齐的访问权限input.

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

Mys*_*ial 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
}
Run Code Online (Sandbox Code Playgroud)