2010-12-14 11 views
1

私は、n回の反復のためにpxqマトリックスのConwayのGOLの実行で行われる遷移の数を計算しようとしています。例えば、最初の状態が1つの点滅(以下のように)である1回の反復が与えられた場合。 5つの移行(2人の出生、1人の生存、2人の過少人口による死亡)があります。私はすでにこれを実現していますが、このロジックをCUDAを使用して実行するように変換したいと思います。以下は私がCUDAに移植したいものです。コンウェイの人生のゲームのためのCudaカーネル

alt text コード:

static void gol() // call this iterations x's 
    { 
     int[] tempGrid = new int[rows * cols]; // grid holds init conditions 
     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < cols; j++) 
      { 
       tempGrid[i * cols + j] = grid[i * cols + j]; 
      } 
     } 

     for (int i = 0; i < rows; i++) 
     { 
      for (int j = 0; j < cols; j++) 
      { 
       int numNeighbors = neighbors(i, j); // finds # of neighbors 

       if (grid[i * cols + j] == 1 && numNeighbors > 3) 
       { 
        tempGrid[i * cols + j] = 0; 
        overcrowding++; 
       } 
       else if (grid[i * cols + j] == 1 && numNeighbors < 2) 
       { 
        tempGrid[i * cols + j] = 0; 
        underpopulation++; 
       } 
       else if (grid[i * cols + j] == 1 && numNeighbors > 1) 
       { 
        tempGrid[i * cols + j] = 1; 
        survival++; 
       } 
       else if (grid[i * cols + j] == 0 && numNeighbors == 3) 
       { 
        tempGrid[i * cols + j] = 1; 
        birth++; 
       } 
      } 
     } 

     grid = tempGrid; 
    } 
+0

具体的には、並列化、ストレージ、実際のCUDAプログラミングなどのアイデアが必要です。 ? – Rup

+0

申し訳ありませんが、私はどのように並列処理にアプローチすべきですか? – dnbwise

答えて

3

あなたの主な減速は、メインメモリへのアクセスであることを行っているに戻ってその結果を書き込み、共有メモリ

  • の内容に基づいて、彼らの生存の計算を行うことができます。だから私はあなたが利用可能なハードウェアに基づいて大規模なスレッドブロックサイズを選択することをお勧めします。 256(16x16)はハードウェアとの互換性のために適しています。これらのスレッドブロックはそれぞれ、ボードのわずかに小さいセクションの結果を計算します.16x16を使用した場合、ボードの14x14セクションの結果が計算されます。 (16x16ブロックを使用して16x16チャンクではなく14x14チャンクを計算する理由は、メモリ読み取りコアレーションのためです)。

    ボードを14x14チャンクに分割します。それは、しかし、あなたは、カーネル内で

    board_width/14board_height/14のようなフィット感が、最も可能性の高いものが表示され、各スレッドが共有メモリにその要素をロードしています。そして、syncthreads。そして、真ん中の14x14要素は、新しいを計算している整理(あなたのグリッドであります(共有メモリに格納された値を使用して)グローバルメモリに書き戻します。共有メモリを使用すると、グローバル読み書きを最小限に抑えることができます。コーナーはグローバルメモリアクセスを無駄にします。その値は9回ではなく1回または3回しか使われないためです。

  • 0

    ここに1つの方法ですあなたが進む可能性:

    1. 各スレッドが
    2. 各スレッドが最初にロードまで一つの要素から、グリッドの1つの要素のための計算を行います。共有グリッドのメイングリッド
    3. スレッドブロックのエッジにあるスレッドは、境界要素をロードする必要もありますNTS
    4. 各スレッドは、各スレッドは、メインメモリ
    関連する問題