cuốn sách gpt4 ai đã làm

c - Phép nhân sử dụng SSE (x*x*x)+(y*y*y)

In lại Tác giả: Vũ trụ không gian 更新时间:2023-11-04 05:30:14 28 4
mua khóa gpt4 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)

调用代码如下所示:

 LÀM {
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);

câu trả lời hay nhất

  • 用 (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
Bài viết khuyến nghị: python - Matplotlib 在图中填充空白
Bài viết khuyến nghị: javascript - 如何在浏览器调整大小时启用滚动
Bài viết khuyến nghị: c - C 中的魔法与 malloc、fork 和 open
Bài viết khuyến nghị: c - 使用按位运算符提取位
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress