2013-03-12 39 views
1

如何在CUDA中編寫C++表達式?第一個循環很容易,但之後? (我把我的啓動內核)CUDA中的Triple For循環

啓動內核

dim3 dimBlock(16); 
dim3 dimGrid((c + (dimBlock.x - 1))/dimBlock.x); 

C++ 3環式

for (int i = 0; i < c; i++) { 

    int val1 = A[ i ]; 

    int val2 = B[ i ]; 

    for (int j = val1 - 10; j < val1 + 10; j++) { 

     for (int k = val2 -10; k < val2 + 10; k++) { 

      //calculations 
     }   
    } 
} 

回答

1

有2個策略,立刻浮現在腦海中。

  1. 用於最外層循環的每次迭代中創建一個螺紋。然後,每個線程將在其線程代碼中保留內部2個嵌套循環。

    __global__ void mykernel(int *A, int *B, int size_c, ...){ 
        int i = threadIdx.x + blockDim.x*blockIdx.x; 
        if (i < size_c){ 
        int val1 = A[ i ]; 
        int val2 = B[ i ]; 
        for (int j = val1 - 10; j < val1 + 10; j++) { 
         for (int k = val2 -10; k < val2 + 10; k++) { 
         //calculations 
         }   
        }  
        } 
    } 
    
    %define nTPB 512 
    dimBlock(nTPB); 
    dimGrid((c+nTPB-1)/nTPB); 
    
  2. 用於最外層循環的每次迭代中創建一個。然後,由於內部循環迭代次數爲20 * 20 = 400次迭代,因此將一個線程分配給每個最內層循環迭代。

    __global__ void mykernel(int *A, int *B, ...){ 
        int i = blockIdx.x; 
        int idx = threadIdx.x; 
        int idy = threadIdx.y 
        int val1 = A[ i ]; 
        int val2 = B[ i ]; 
        if (idx < 20) && (idy < 20) { 
        int j = val1 - 10 + idy; 
        int k = val2 - 10 + idx; 
         //calculations 
        }    
    } 
    
    dimBlock(20, 20); 
    dimGrid(c); 
    
+0

謝謝你,我在找第二個解決方案 – user2055437 2013-03-12 19:40:05