1

在我的应用程序中,我对工作进行了划分,以便每个经线执行一个工作单元。

为了开始单元上的工作,每个块的线程零必须计算从常数C0CWwhere的递归关系W= #warp - 1

从概念上讲,它看起来像这样:

if(threadId.x ==0) {
    for(x=1;x<#warps;x++) {
        C[x] = calc_recur(C[x-1]);
    }
}
syncthreads();

我想要做的是在计算每个扭曲的递归关系时尽早释放线程。

它看起来像这样:

for(x=1;x<#warps;x++) {
    if(threadId.x ==0) {
        C[x] = calc_recur(C[x-1]);
    }
    if(x < warpId) {
        partial_syncthreads(x);
    }
}

其中 partial_syncthreads 将同步属于大于 x 的 warp 的所有线程。

是否有任何算法可以实现这一点?

4

1 回答 1

1

我不完全确定,但我怀疑是否有一种方法可以减少内核运行时的线程数。

正因为如此,我建议,

(1) 保持原样。在这一点上,同步线程毫无意义。

(2) 将您的内核拆分为多个内核。因此,您显示的代码是通过减少的线程数计算的。但是使用这种方法,您将无法访问共享内存。

(3) 在主机上进行计算。由于它是一个高度串行的实现,这可能是更快的方法。在这里,您必须确定,您的功能calc_recur()足够昂贵,传输到主机不会否定速度优势。

于 2013-05-06T07:07:47.140 回答