gpt4 book ai didi

c - 如何使用 SSE 汇编指令查找毕达哥拉斯三元组?

转载 作者:行者123 更新时间:2023-11-30 20:11:16 25 4
gpt4 key购买 nike

我对汇编非常陌生,我想找到 1 到 100 范围内的所有毕达哥拉斯三元组。我正在 C 中生成所有数字,所有其他计算都应该在汇编 SSE 中完成。我试图通过使用 sqrt 命令来做到这一点(我已经尝试了所有这些命令),但我无法让它工作。有人可以告诉我该怎么做吗?

这就是我到目前为止所得到的:

int main(){
for (int i = 1; i <= 100; i++)
{
a++;
if (a > 100)
a = 0;
for (int j = 1; j <= 100; j++)
{
b++;
if (b > 100)
b = a;
_asm //tricky part begins here:
{
movups xmm0, a
movups xmm1, b
pmuludq xmm0, xmm0
pmuludq xmm1, xmm1
//movups xmm2, 0
//paddd xmm2, xmm0
//paddd xmm2, xmm1
movups z, xmm0
}
printf("%d\n", z);
}
}
}

最佳答案

您的方法的基本问题是您需要并行查看 4 个 b 值,因此您不能仅从 C 标量变量加载。您需要在循环迭代中将内容保存在 vector 寄存器中,因为您不仅仅是从内存或其他东西加载 vector 。您应该在 asm 中编写整个循环,因为由于获取结果输入/输出的不可避免的开销,MSVC 内联 asm 很难包装短序列。

当然,向量化此循环的最佳方法是使用 C 内在函数,而不是使用内联汇编。然后,如果有必要(并且可能的话),您可以通过检查其 asm 输出是否效率低下来控制编译器生成更好的 asm。 (参见Why is this C++ code faster than my hand-written assembly for testing the Collatz conjecture?)

<小时/>

当然,如果您真的只是想创建有效的代码来生成毕达哥拉斯三元组,那么您的算法也是假的:

维基百科文章有一个 generating a triple描述欧几里得公式的部分。与在整个 a=[1..100] b=[1..100] 搜索空间的强力搜索中检查命中情况相比,迭代这将是一个不同的问题,因为检查是否数字是完全平方数相当慢。

此外,检测哪些 vector 元素与条件匹配也很笨拙。打包比较指令然后 PMOVMSKB(或 MOVMSKPS)将为您提供一个位图,但是当命中很少时(例如,实现 memchr ,循环在第一次命中后停止。

关于c - 如何使用 SSE 汇编指令查找毕达哥拉斯三元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41231995/

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