如何为这个内联汇编代码编写内联代码?
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];
我不擅长 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];