Cuda 带有同步线程的每块通用指令

Cuda 带有同步线程的每块通用指令,cuda,Cuda,我正在寻找一些并行实现Miller-Rabin素性证明的建议。让我们假设在输入时有一些大的奇数n和m参数,这意味着它应该向前搜索多少奇数(因此它就像n,n+2,n+4等等)。我想以以下方式启动内核: miller_rabin_kernel<<<m, k>>>(dev_n, ..) 是否有更好的方法,或者这是比较常见的做法?当每个区块需要计算的具体数量不同时,您的示例是一种合理的方法 如果您有大量的块,并且t和s的计算相当密集,那么您可以通过使用单独的内核来预

我正在寻找一些并行实现Miller-Rabin素性证明的建议。让我们假设在输入时有一些大的奇数
n
m
参数,这意味着它应该向前搜索多少奇数(因此它就像
n
n+2
n+4
等等)。我想以以下方式启动内核:

miller_rabin_kernel<<<m, k>>>(dev_n, ..)

是否有更好的方法,或者这是比较常见的做法?

当每个区块需要计算的具体数量不同时,您的示例是一种合理的方法

如果您有大量的块,并且
t
s
的计算相当密集,那么您可以通过使用单独的内核来预计算
t
s
值,每个数量使用一个线程,从而获得一些好处,但因此能够有效地使用块中的所有线程。这个内核可以更有效地使用设备计算能力和内存带宽,因为所有线程都参与其中。然后,您可以将
t
s
数量保留在全局数组中,您可以访问每个块:

t = t_array[blockIdx.x];
在您的
t
s
安装内核完成后,您可以大致如图所示调用主内核


调用第一个内核会有一些开销,可能需要几微秒。同样,如果
t
s
的计算量很大,则提高的效率可能会抵消开销,从而获得可能的好处。

您的方法是合理的。如果每个块的变量t、s等不同,那么您的方法是有意义的。如果t、s等对于所有块都是相同的,那么最好预先计算并将它们作为内核参数传递,或者使用模板内核。是的,这些t、s变量对于每个块都是不同的,因为它们取决于n+2*blockIdx.x值。老实说,它们当然可以在主机端的某种预处理阶段提前准备好,然后传输到设备内存中,不过我想将可能的大多数操作转移到并行代码中。诀窍是我实际上有两个级别的并行化。有了两个级别的并行化,动态并行会有帮助吗?@JackOLantern:这是一个有趣的想法,但我只能访问费米体系结构设备。
t = t_array[blockIdx.x];