从脚本中较高的函数调用较低的函数
问题描述:
我试图想出一种方法来让计算机为我做一些工作。我正在使用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 b3
和a0 a1 b0 b1
,并取代它们稍快。
我无法弄清楚纸上的内容,但我想到了一个解决方案。如果让计算机强制执行所需的步骤,该怎么办?只是递归地通过不同的选项,看看什么给出了正确的答案。
我得到了它与多工作,当我想它返回它返回(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)
非常好,如果我这样说自己。
但是,当我想实现鸿沟时,我偶然发现了一个问题。乘法不仅需要调用乘法,还必须调用除法。好吧,所以我们把分水岭放在上面乘。但鸿沟不仅不得不称为鸿沟,它还必须称为乘数,这在脚本中较低,因此它还不存在。
我从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;
}
要解决这个问题,你需要请拨打int doStuff(int)
的forward declaration。通常情况下,这是一个头文件来完成的 - 无论哪种方式,你只需要添加这样的事情:
// #includes, etc. go here
int doStuff(int);
int getFoo(int);
// methods follow
当然! :D 它只是滑了我的脑海,但我知道堆栈溢出的人类搜索引擎可以帮助我。 ;) – knight666 2009-09-05 15:00:05