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)
         )
      )
   );
}

ご覧のとおり、そこには4つのがあり、それらをとの組み合わせに置き換える_mm_shuffle_psことができるかどうか疑問に思いました。_mm_unpackhi_ps_mm_unpacklo_psa2 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)

私がそう言うなら、とてもいいです。

しかし、除算を実装したいときに、問題に遭遇しました。Multiplyは、multiplyを呼び出すだけでなく、divideも呼び出す必要があります。さて、乗算の上に除算を置きます。ただし、divideは、divideを呼び出すだけでなく、スクリプトの下位にあるmultiplyも呼び出す必要があるため、まだ存在していません。

Visual C ++の空のコンソールアプリケーションから始めて、すべてをQuadTests.cppに配置しました。

これらの2つの関数が相互に呼び出すことができることを確認するにはどうすればよいですか?

前もって感謝します。

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 に答える