2016-04-23 8 views
-2

私のテスト機能はこのようなものです。CUDAでこのカーネルを実行すると効果的です

DIMENSION 20 
POPSIZE 5000 

    __global__ void repairT(int* H, int* diff){ 

     int tidx = blockDim.x * blockIdx.x + threadIdx.x; 
     int ii = tidx * DIMENSION; 

     //if (ii < DIMENSION * POPSIZE) 
     //{ 
      int Hdiff[DIMENSION] = { 0 }; 
      int diffcount = 0; 
      bool isInIndiv = false; 

      //complement set H 
      for (int i = 1; i <= DIMENSION; i++) 
      { 
       for (int j = ii; j < ii + DIMENSION; j++) //H for 
       { 
        if (i == H[j]) 
        { 
         isInIndiv = isInIndiv || true; 
        } 
       } 
       if (isInIndiv == false) 
       { 
        Hdiff[diffcount] = i; 
        diffcount++; 
       } 
       else 
        isInIndiv = false; 
      } 
      // diff to array 
      int diffc = ii * DIMENSION; 
      for (int i = 0; i < DIMENSION; i++) 
      { 
       diff[diffc] = Hdiff[i]; 
       diffc++; 
      } 
     //} 
    } 

私はH(POPSIZE * DIMENSION)と呼ばれる大きな1D配列を持っています。そして、新しい配列diffを作成して、間隔0-19,20-39などで不足要素を節約したいと考えています。

そしてこのコードを効果的にparralel 5000timesで実行する必要があります。これを試しましたが、 0-12の間隔でH

dim3 nbThreadsR1(128); 
dim3 nbBlocksR1((POPSIZE/nbThreadsR1.x) + 1); 
repairT << <nbBlocksR1, nbThreadsR1 >> >(d_H, d_diff); 

Pls私にいくつかのアドバイスをお願いします。

+0

私は –

答えて

1

あなたはHにアクセスし、diffはcoalescedではありません。つまり、メモリユニットの効率はあまり高くありません。データの順序を変更するか、アクセスを統合するようにコードを変更する必要があります。

また、H [j]をかなりの回数読み取っているようです。あなたはそれが過剰を避けるためにプリロード別の小さな配列Hcacheを定義することもできます読み取ります。最後に

 int Hcache[DIMENSION]; 
     for (int j = 0; j < DIMENSION; j++) //H for 
     { 
      Hcache[j] = H[j+ii]; 
     } 
     for (int i = 1; i <= DIMENSION; i++) 
     { 
      for (int j = 0; j < ii; j++) //H for 
      { 
       if (i == Hcache[j]) 
       { 
        isInIndiv = isInIndiv || true; 
       } 
      } 
      if (isInIndiv == false) 
      { 
       Hdiff[diffcount] = i; 
       diffcount++; 
      } 
      else 
       isInIndiv = false; 
     } 

、あなたはコンパイラがレジスタに十分な自由を取得し、お使いのデバイスがHcacheとHdiffであることを、多くのように扱うことができることを確認しますレジスタファイルに格納されます(maxrregcountオプションhereを参照)。

+0

上で動作カーネルなし可能だ。私は質問を理解し、Petrを助けるために最善を尽くしました。私は、同じデータの繰り返し読み込みが非常に高価であることを指摘し、この不変量をループから外すとパフォーマンスが向上すると考えました。質問の理解を深めるには、私に教えてください。 – talonmies

+1

@talonmies、それを頼まれIIの宣言からDIMENSIONを削除しますが、今、時には間違った計算を行うが、それは、私はこれが(非常に悪い)で質問に答えていないかなり確信しているすべてのアレイ –

+0

実際には "自分のコードが問題に働かないよう助けてくれますが、回答が得られないほどの詳細はありません – talonmies

関連する問題