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

C 如何为这个内联汇编代码编写内联代码?,c,simd,inline-assembly,intrinsics,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

我不擅长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];
}
for(int i=0;i
您最好将整个代码替换为以下内容:

float x = A[i];
for (int j = 0; j < N; j++) C[j] = x * B[j];
float x=A[i];
对于(intj=0;j
编译器将在优化方面做得比上面介绍的asm优化的有些幼稚的尝试好得多。解雇你的同事:)

至于它在做什么,不是很多。它只是在8个批次的浮动中循环。正如我所说的,这是相当愚蠢的,使用上面的标准C代码从性能角度来看,你会更好

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];
float x=A[i];
__m256 x=mm256 set1 ps(x);
对于(int j=0;j
谢谢您的回答。事实上,我试过你推荐的原始代码。但是速度变慢了。有任何编译器优化开关吗?-mavx2-mfma-O2-ffast math(尽管要小心最后一个-它可能会改变精度),它真的不应该变慢。请参见此处:查找使用vmulps指令的内部循环。事实上,因为这里实际CPU的工作量很小,所以代码会受到内存带宽的限制。答案很好。还有一个问题。Visual Studio项目属性页中有哪些内容?如果编译器在优化SIMD方面比asm优化方面做得好得多,我什么时候应该使用SIMD?这个循环优化得很差;当它可能只有4或5个单位时,它是6个单位。还有,你是说像笔记本电脑那样的移动x86 CPU吗?还是说手臂?是的,有ARM NEON的内在特性。但是编译器在使用NEON内部函数时往往做得不好,不像x86那样,在x86中内部函数得到了很好的优化。