如何为这个内联汇编代码编写内联代码?

How to write intinsic code for this inline assembly code?

我不擅长 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];
}

你最好只用以下代码替换整个代码:

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

与上面介绍的对 asm 优化的有点幼稚的尝试相比,编译器将在优化方面做得更好。解雇你的 co-worker :)

至于它在做什么,不是很多。它只是以 8 个为一组循环遍历浮点数。正如我所说,它非常愚蠢,使用上面的标准 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];