在我的应用程序中,我将工作划分为每个warp做一个工作单元。
为了开始对单元的工作,每个块的线程零必须计算从常量C0
到CW
的{{1}}的递归关系。
从概念上看,它看起来像这样:
W= #warp - 1
我想要做的是在计算每个扭曲的递归关系时尽早释放线程。
它看起来像这样:
if(threadId.x ==0) {
for(x=1;x<#warps;x++) {
C[x] = calc_recur(C[x-1]);
}
}
syncthreads();
其中partial_syncthreads将同步属于大于x的warp的所有线程。
是否有任何算法可以启用此功能?
答案 0 :(得分:1)
我不完全确定,但我怀疑,有一种方法可以减少内核运行时的线程数。
因此,我建议
(1)原样离开它。此时同步线程毫无意义。
(2)将内核拆分为多个内核。因此,您显示的代码是通过减少的线程数来计算的。但是使用此方法,您将无法访问共享内存。
(3)在主机上执行计算。由于它是一个高度串行的实现,这可能是更快的方式。在这里你必须确定,你的函数calc_recur()
足够昂贵,转移到主机,并不能否定速度优势。