複数のプロシージャを含む関数を並列化しようとしています。関数は次のようになります。
void _myfunction(M1,M2){
for (a = 0; a < A; a++) {
Amatrix = procedure1(M1) /*contains for loops*/;
Bmatrix = procedure2(M1) /*contains for loops*/;
...
for ( z = 1 ; z < Z ; z++ ){
calculations with Amatrix(z) and obtain AAmatrix
calculations with Bmatrix(z) and obtain BBmatrix
for ( e = 1; e < E; e++) {
calculations with AAmatrix(e) and obtain CCmatrix
calculations with BBmatrix(e) and obtain DDmatrix
}
}
for (q = 0; q < Q; q++){ calculations with CCMatrix(q) }
for (m = 0; m < M; m++){ calculations with DDMatrix(q) }
}
}
関数procedure1()
andに関しては、procedure2()
それらを CUDA に移植しましたが、すべてうまくいっています (これらの各プロシージャには独自の for ループがあります)。これらの手順が分離されている理由は、より一般的な概念を持つ残りのコードとは対照的に、概念的に独立したアルゴリズムであるためです。
現在、残りのコードを CUDA に移植しようとしていますが、どうすればよいかわかりません。もちろん、可能であれば、関数全体の同じ構造を維持したいと考えています。最初に考えたのは、関数_myfunction(arg1,arg2,..)
をカーネルに変換することでしたが、問題は、内部で順番に実行されるカーネル関数が既に 2 つあることです。ストリームを使用できるとどこかで読んだことがありますが、それを行う方法とそれが正しいかどうかはわかりません。
質問:誰かがプログラムを CUDA に移植する方法についてヒントを与えることができますか?
PS: GeForce 9600GT (Compute Capability 1.1) と CUDA Toolkit 5.0 を使用しています。