Triple For Loop в CUDA

Как я могу написать ниже C ++ выражение в CUDA? Это легко для первого цикла, но после? (Я поставил свое ядро ​​запуска)

запустить ядро

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);
    
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]