我试图想出一个办法让电脑为我做了一些工作。我使用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的组合代替他们,是稍快。

我不能弄清楚在纸上,但我想的溶液。如果让电脑暴力破解的步骤,需要什么样的?通过不同的场所仅有一步递归,看看给出了正确的答案。

我得到它与乘法工作,当我希望它返回它返回这个(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)。通常情况下,这是一个头文件来完成的 - 无论哪种方式,你只需要添加这样的:

// #includes, etc. go here

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

// methods follow
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top