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