归约算法

在进行归约算法的实现的时候,我们会通过启动块、线程来对数据进行归约,可是,我想问的是,当数据量很大的时候,由于线程数和block都有上限,那么该如何进行归约呢?

LZ您好:

这其实完全不成为问题的。

可以采用不同的规约格式实现。

比如您有10241024个数据,这完全可以仅仅使用1024或者512个线程是实现规约相加,而不必使用10241024个数据。

假定使用512个线程的block,一个block来计算上述数据,假定数据是连续存放的,那么:

global reduction_kernel(float* cat)

{
int tid=threadIdx.x; //使用512个threads
float dog=0;
for(int i=0;i<10241024/512;++i)
{
dog+=cat[tid+i
512];
}
__syncthreads();
//循环完成后,再对每个线程自己的累加结果dog进行折半规约即可,此时只有512个数据。
//可使用常规的规约格式,并利用shared memory


}

大致采用如此流程即可,您可以根据实际情况进行调整。

祝您编码顺利~

多谢,嘿嘿,了解了。。。
不过,还想问您一个问题:就是在进行线程块和线程数的分配的时候,怎么样才能分配到一个效率最高的块数和线程数呢?

LZ 您好:

这个需要根据具体问题和具体硬件决定的,以及可能需要尝试参数组合得到最佳方案。

祝您好运~