gpt4 book ai didi

c++ - 从脚本中较高的函数调用脚本中较低的函数

转载 作者:行者123 更新时间:2023-11-28 08:32:21 25 4
gpt4 key购买 nike

我正在尝试想出一种方法让计算机为我做一些工作。我正在使用 SIMD(SSE2 和 SSE3)来计算叉积,我想知道它是否可以更快。目前我有以下内容:

const int maskShuffleCross1 = _MM_SHUFFLE(3,0,2,1); // y z x
const int maskShuffleCross2 = _MM_SHUFFLE(3,1,0,2); // z x y

__m128 QuadCrossProduct(__m128* quadA, __m128* quadB)
{
// (y * other.z) - (z * other.y)
// (z * other.x) - (x * other.z)
// (x * other.y) - (y * other.x)

return
(
_mm_sub_ps
(
_mm_mul_ps
(
_mm_shuffle_ps(*quadA, *quadA, maskShuffleCross1),
_mm_shuffle_ps(*quadB, *quadB, maskShuffleCross2)
),
_mm_mul_ps
(
_mm_shuffle_ps(*quadA, *quadA, maskShuffleCross2),
_mm_shuffle_ps(*quadB, *quadB, maskShuffleCross1)
)
)
);
}

如您所见,那里有四个 _mm_shuffle_ps,我想知道是否可以将它们替换为 _mm_unpackhi_ps_mm_unpacklo_ps 分别返回 a2 a3 b2 b3a0 a1 b0 b1 并且速度稍快。

我在纸上想不出来,但我想到了一个解决方案。如果让计算机暴力破解所需的步骤怎么办?只需递归地遍历不同的选项,看看哪个给出了正确答案。

我让它与 multiply 一起工作,当我希望它返回 (3, 12, 27, 0) 时它返回这个:

startA = _mm_set_ps(1.00, 2.00, 3.00, 0.00);
startB = _mm_set_ps(3.00, 3.00, 3.00, 0.00);
result0 = _mm_mul_ps(startA, startB);
// (3.00, 6.00, 9.00, 0.00)
result1 = _mm_mul_ps(startA, result0);
// (3.00, 12.00, 27.00, 0.00)

非常好,如果我自己这么说的话。

但是,当我想实现 divide 时,我遇到了一个问题。乘法不仅要调用乘法,还必须调用除法。好的,所以我们把除法放在乘法之上。但是divide不仅要调用divide,还要调用multiply,在脚本中比较靠下,所以现在还不存在。

我从一个空的 Visual C++ 控制台应用程序开始,然后将所有内容都放在 QuadTests.cpp 中。

如何确保这两个函数可以相互调用?

提前致谢。

最佳答案

确认一下,您的问题是像这样排列的函数不起作用,因为 doStuff 在您从 getFoo 调用它时尚未声明:

int getFoo(int bar) {
doStuff(bar + 1);
}

int doStuff(bar) {
if (bar == 2) {
return getFoo(bar);
}

return bar * 8;
}

要解决此问题,您需要制作一个 forward declaration int doStuff(int)。通常,这是通过头文件完成的——无论哪种方式,您只需要添加如下内容:

// #includes, etc. go here

int doStuff(int);
int getFoo(int);

// methods follow

关于c++ - 从脚本中较高的函数调用脚本中较低的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1383485/

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