gpt4 book ai didi

c - 使用 SSE (x*x*x)+(y*y*y) 的乘法

转载 作者:太空宇宙 更新时间:2023-11-04 05:30:14 28 4
gpt4 key购买 nike

我正在尝试使用 SIMD 优化此功能,但我不知道从哪里开始。

long sum(int x,int y)
{
return x*x*x+y*y*y;
}

反汇编函数如下所示:

  4007a0:   48 89 f2                mov    %rsi,%rdx
4007a3: 48 89 f8 mov %rdi,%rax
4007a6: 48 0f af d6 imul %rsi,%rdx
4007aa: 48 0f af c7 imul %rdi,%rax
4007ae: 48 0f af d6 imul %rsi,%rdx
4007b2: 48 0f af c7 imul %rdi,%rax
4007b6: 48 8d 04 02 lea (%rdx,%rax,1),%rax
4007ba: c3 retq
4007bb: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)

调用代码如下所示:

 do {
for (i = 0; i < maxi; i++) {
j = nextj[i];
long sum = cubeSum(i,j);
while (sum <= p) {
long x = sum & (psize - 1);
int flag = table[x];
if (flag <= guard) {
table[x] = guard+1;
} else if (flag == guard+1) {
table[x] = guard+2;
count++;
}
j++;
sum = cubeSum(i,j);
}
nextj[i] = j;
}
p += psize;
guard += 3;
} while (p <= n);

最佳答案

  • 用 (x|y|0|0) 填充一个 SSE 寄存器(因为每个 SSE 寄存器包含 4 个 32 位元素)。让我们称它为 r1
  • 然后将该寄存器复制到另一个寄存器 r2
  • 执行 r2 * r1,将结果存储在 r2 中。
  • 再次执行 r2 * r1 将结果存入 r2
  • 现在在 r2 中你有 (x*x*x|y*y*y|0|0)
  • 将 r2 的低位两个元素解包到单独的寄存器中,将它们相加(SSE3 有水平相加指令,但仅适用于 float 和 double)。

最后,如果这比编译器已经为您生成的简单代码更快,我真的会感到惊讶。如果您有要操作的数据数组,SIMD 会更有用。

关于c - 使用 SSE (x*x*x)+(y*y*y) 的乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8357182/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com