我需要在N个数字的向量上进行数据缩减(找到k-max数)。问题是我事先不知道N(在编译之前),并且我不确定我在构建两个内核时是否正确 - 一个有(int)(N / block_size)
个块而第二个内核有一个N % block_size
个线程的块。
CUDA中的block_size是否有更好的方法来处理“不可分割”的数字?
答案 0 :(得分:3)
典型的方法是这样的(1-D网格示例):
#define DATA_SIZE ... // this is some arbitrary number
#define NUM_THREADS_PER_BLOCK ... // this is block size, usually a multiple of 32
// typical choices are 256, 512, 1024 (pick one)
unsigned int N = DATA_SIZE;
unsigned int nTPB = NUM_THREADS_PER_BLOCK;
my_kernel<<<(N + nTPB - 1)/nTPB, nTPB>>>(...);
这假设您的内核在开头有一个“线程检查”,如下所示:
unsigned int idx = threadIdx.x + blockDim.x*blockIdx.x;
if (idx < DATA_SIZE){
// kernel code goes here
}
答案 1 :(得分:1)
@ RobertCrovella的回答描述了处理这种情况的标准方法,通常不需要担心内核中需要的额外if
条件。
但是,另一种方法是将输入和输出缓冲区分配给一个可被块大小整除的数字,运行内核(不带if
),然后忽略额外的结果,例如不要将它们复制回CPU。