【发布时间】:2019-11-30 04:00:20
【问题描述】:
我不擅长 SIMD,所以,我需要帮助来将此代码转换为内部代码。 在我看来,这似乎是 C = A * B,但我不确定。 有谁能够帮我? 另外我想问一下内在函数是否可用于移动处理器。 事实上,下面的代码是针对英特尔 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];
}
【问题讨论】:
-
这个循环优化不好;它可能只有 4 或 5 个微指令,但它是 6 个微指令。另外,您是指像笔记本电脑中那样的移动 x86 CPU 吗?还是你的意思是ARM?是的,ARM NEON 有内在函数。但是编译器通常在 NEON 内在函数方面做得不好,这与 x86 的内在函数得到很好的优化不同。
标签: c simd inline-assembly intrinsics