在进行归约算法的实现的时候,我们会通过启动块、线程来对数据进行归约,可是,我想问的是,当数据量很大的时候,由于线程数和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+i512];
}
__syncthreads();
//循环完成后,再对每个线程自己的累加结果dog进行折半规约即可,此时只有512个数据。
//可使用常规的规约格式,并利用shared memory
…
}
大致采用如此流程即可,您可以根据实际情况进行调整。
祝您编码顺利~
多谢,嘿嘿,了解了。。。
不过,还想问您一个问题:就是在进行线程块和线程数的分配的时候,怎么样才能分配到一个效率最高的块数和线程数呢?
LZ 您好:
这个需要根据具体问题和具体硬件决定的,以及可能需要尝试参数组合得到最佳方案。
祝您好运~