如何为此内联汇编代码编写本征代码?

时间:2019-07-22 08:06:33

标签: c simd inline-assembly intrinsics

我不擅长SIMD,因此,需要帮助将此代码转换为固有代码。 在我看来,似乎C = A * B,但我不确定。 有谁能够帮助我? 我也想问一下固有功能是否可用于移动处理器。 实际上,以下代码是针对Intel CPU的,但是我的工作最终针对的是移动设备。预先感谢。

for (int i = 0; i < M; i++, C += N) {
    float x = A[i];
    _asm {
        mov             esi, N8;
        sub             esi, 8;
        shl             esi, 2;
        xor             edi, edi;
        mov             ebx, B;
        mov             edx, C;
        vbroadcastss    ymm7, x;
    Lrep1:
        cmp             edi, esi;
        jg              Lexit1;
        vmovups         ymm0, ymmword ptr[ebx + edi];
        vmulps          ymm0, ymm0, ymm7;
        vmovups         ymmword ptr[edx + edi], ymm0;
        add             edi, 32;
        jmp             Lrep1;

    Lexit1:
    }
    for (int j = N8; j < N; j++) C[j] = x * B[j];
}

1 个答案:

答案 0 :(得分:1)

您最好将整个代码替换为:

float x = A[i];
for (int j = 0; j < N; j++) C[j] = x * B[j];

与上面介绍的对asm优化的一些天真尝试相比,编译器的优化工作要好得多。解雇你的同事:)

关于它在做什么,不是很多。它只是以8批为单位循环遍历所有float,就像我说的那样,这是非常愚蠢的,使用上面的标准C代码来实现性能POV更好。

float x = A[i];
__m256 _x = _mm256_set1_ps(x);
for (int j = 0; j < N8; j += 8) 
{
  _mm256_storeu_ps(C + j, _mm256_mul_ps(_x, _mm256_loadu_ps(B + j)));
}
for (int j = N8; j < N; j++) C[j] = x * B[j];