Cuda 是否有更好的处理方法;按块大小划分的不可分割数字计数;在库达?

Cuda 是否有更好的处理方法;按块大小划分的不可分割数字计数;在库达?,cuda,parallel-processing,Cuda,Parallel Processing,我需要对N个数的向量进行数据缩减(查找k-max数)。问题是我事先(在编译之前)不知道N,而且我不确定在构造两个内核时是否正确—一个是(int)(N/block\u size)块,另一个是N%block\u size线程块 是否有更好的方法处理CUDA中按块大小“不可分割”的数字计数?典型方法如下(一维网格示例): #定义数据大小…//这是一个任意数 #定义每个块的线程数…//这是块大小,通常是32的倍数 //典型的选择是256、512、1024(选择一个) 无符号整数N=数据大小; unsig

我需要对N个数的向量进行数据缩减(查找k-max数)。问题是我事先(在编译之前)不知道N,而且我不确定在构造两个内核时是否正确—一个是
(int)(N/block\u size)
块,另一个是
N%block\u size
线程块


是否有更好的方法处理CUDA中按块大小“不可分割”的数字计数?

典型方法如下(一维网格示例):

#定义数据大小…//这是一个任意数
#定义每个块的线程数…//这是块大小,通常是32的倍数
//典型的选择是256、512、1024(选择一个)
无符号整数N=数据大小;
unsigned int nTPB=每个块的线程数;
我的_内核(…);
这假设内核在开始时有一个“线程检查”,如下所示:

unsigned int idx = threadIdx.x + blockDim.x*blockIdx.x;
if (idx < DATA_SIZE){
   // kernel code goes here
}
unsigned int idx=threadIdx.x+blockDim.x*blockIdx.x;
if(idx<数据大小){
//内核代码在这里
}

典型方法如下(一维网格示例):

#定义数据大小…//这是一个任意数
#定义每个块的线程数…//这是块大小,通常是32的倍数
//典型的选择是256、512、1024(选择一个)
无符号整数N=数据大小;
unsigned int nTPB=每个块的线程数;
我的_内核(…);
这假设内核在开始时有一个“线程检查”,如下所示:

unsigned int idx = threadIdx.x + blockDim.x*blockIdx.x;
if (idx < DATA_SIZE){
   // kernel code goes here
}
unsigned int idx=threadIdx.x+blockDim.x*blockIdx.x;
if(idx<数据大小){
//内核代码在这里
}

@RobertCrovella的回答描述了处理这种情况的标准方法,通常不需要担心内核中需要的额外的
条件


但是,另一种替代方法是分配输入和输出缓冲区,并将其填充到可被块大小整除的数字,运行内核(如果
,则不使用
),然后忽略额外的结果,例如,不将它们复制回CPU。

@RobertCrovella的回答描述了处理这种情况的标准方法,通常不需要担心内核中需要的额外的
(如果
)条件


但是,另一种方法是分配输入和输出缓冲区,并将其填充到一个可被块大小整除的数字,运行内核(不使用
if
),然后忽略额外的结果,例如不将它们复制回CPU。

Thx获取答案。但是,它比不使用IF语句创建两个内核更有效吗?IF语句的成本(纳秒)与启动一个额外内核的成本(微秒)相比微不足道。这是有争议的。内核启动开销取决于您是否在WDDM上运行,但无论哪种方式,如果您有数亿个线程,if语句开销都不是那么微不足道。答案很好,我只是好奇:)我更喜欢
if(idx>=DATA\u SIZE)返回
这样我就不会把内核主体放在一个大的
if
子句中。Thx作为答案。但是,它比不使用IF语句创建两个内核更有效吗?IF语句的成本(纳秒)与启动一个额外内核的成本(微秒)相比微不足道。这是有争议的。内核启动开销取决于您是否在WDDM上运行,但无论哪种方式,如果您有数亿个线程,if语句开销都不是那么微不足道。答案很好,我只是好奇:)我更喜欢
if(idx>=DATA\u SIZE)返回if
子句中包含内核体。