2013-03-12 94 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