Как я могу написать ниже 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
}
}
}
Есть 2 стратегии, которые сразу приходят на ум.
Создай нить для каждой итерации самого внешнего цикла. Тогда каждый поток сохранит внутренние 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);
Создай блок для каждой итерации самого внешнего цикла. Тогда, поскольку внутренние циклы имеют итерации 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);
Других решений пока нет …