0

我试图想出一种方法让计算机为我做一些工作。我正在使用 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,我想知道是否可以将它们替换为 and 的组合,_mm_unpackhi_ps分别_mm_unpacklo_ps返回a2 a3 b2 b3anda0 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)

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

然而,当我想实现分裂时,我偶然发现了一个问题。乘法不仅要调用乘法,还必须调用除法。好的,所以我们把除法放在乘法之上。但是divide不仅要调用divide,还得调用multiply,在脚本中比较低,所以还不存在。

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

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

提前致谢。

4

1 回答 1

1

只是为了确认,您的问题是这样安排的函数不起作用,因为doStuff在您调用它时没有声明getFoo

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

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

    return bar * 8;
}

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

// #includes, etc. go here

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

// methods follow
于 2009-09-05T14:57:10.663 回答