スクリプト内で高い機能から下のスクリプトで関数を呼び出します
-
21-09-2019 - |
質問
私はコンピュータが私のためにいくつかの作業を行うようにする方法を考え出すしようとしています。私は、クロス積を計算する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_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でプットすべてを開始します。
私は確信してこれら2つの関数はお互いを呼び出すことができ作る方法を教えてください。
事前に感謝します。
解決
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