-2

複数のプロシージャを含む関数を並列化しようとしています。関数は次のようになります。

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 を使用しています。

4

1 に答える 1