CUDAカーネルを使用して、Cで相互相関関数を高速化しようとしています。今のところ、これは私が持っているものです。CUDAカーネルのさまざまなスレッドグループ
__global__ void xcorr(cuDoubleComplex *temp1, cuDoubleComplex *temp2, cuDoubleComplex *temp3, int Nb, int binM, int Nspb)
{
for (int k1 = 0; k1 < Nb; k1++)
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
for (int j1 = 0; j1 < Nspb; j1++)
{
if ((j1 + idx) <(Nspb + binM))
{
temp3[idx + k1*(binM + 1)].x += (temp1[idx + j1 + (k1*(binM + Nspb))].x*temp2[j1 + (k1*Nspb)].x) + (temp1[idx + j1 + (k1*(binM + Nspb))].y*temp2[j1 + (k1*Nspb)].y);
temp3[idx + k1*(binM + 1)].y += (-temp1[idx + j1 + (k1*(binM + Nspb))].x*temp2[j1 + (k1*Nspb)].y) + (temp1[idx + j1 + (k1*(binM + Nspb))].y*temp2[j1 + (k1*Nspb)].x);
}
}
}
}
結果は、私が期待したものですが、それはまだ50 seconds
の周りに、動作させるために時間がかかっ。私はカーネルを召喚するとき、私はそれを行うこのよう
xcorr << <1, 1000 >> > (cuda_E2, cuda_A2, cuda_temp, Nb, *binM, Nspb);
そして、何私が考えていたことはj1
(Nspb=5000
)でループを回避するために、1000件のスレッドごとに、代わりに一つだけの6つのブロックを送信することです。私はさまざまな方法で試しましたが、2つの異なるスレッドグループを使用する方法を見つけることができません。最初のブロックは同じ方法で、もう1つはj1
ループを置き換えます。誰かが私にどのように表示できますか?
ご協力いただければ幸いです。
周波数ドメインで相互相関を行うことを検討してください。ここでは乗算が減りますか? –
@Paulのコメントに続いて、相互相関を畳み込みのように表現できるので、カフを使用することができます。 –
アドバイスをいただきありがとうございますが、私はそれがうまくいくとは思っていません。少なくとも、それは価値があるでしょう、私は両方のシグナルとの相互相関を行っているだけではありません。だから私はそれらを切り取らなければならない場合は、各抽出にfftを実行して、最後にそれぞれを取り除く...もっと時間が必要だと思う。 –