如何在CUDA中编写C ++表达式?第一次循环很容易但之后? (我把我的启动内核)
启动内核
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
}
}
}
答案 0 :(得分: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);