Pycuda 并发

Pycuda Concurrency

为什么 PyCuda KernelConcurrency Example 中的代码在 'concurrent' 模式下不会 运行 更快?看来我的 GPU 上应该有足够的资源……我错过了什么?

这是 'concurrent' 版本的输出,第 63 行未注释:

=== Device attributes
Name: GeForce GTX 980
Compute capability: (5, 2)
Concurrent Kernels: True

=== Checking answers
Dataset 0 : passed.
Dataset 1 : passed.

=== Timing info (for last set of kernel launches)
Dataset 0
kernel_begin : 1.68524801731
kernel_end : 1.77305603027
Dataset 1
kernel_begin : 1.7144639492
kernel_end : 1.80246400833

这是第 63 行被注释掉的版本。这应该不再 运行ning 并发,并且应该慢得多。在我看来几乎一样(两种情况下大约为 0.08 - 0.09):

=== Device attributes
Name: GeForce GTX 980
Compute capability: (5, 2)
Concurrent Kernels: True

=== Checking answers
Dataset 0 : passed.
Dataset 1 : passed.

=== Timing info (for last set of kernel launches)
Dataset 0
kernel_begin : 1.20230400562
kernel_end : 1.28966403008
Dataset 1
kernel_begin : 1.21827197075
kernel_end : 1.30672001839

我在这里遗漏了什么吗?还有其他测试并发的方法吗?

真正了解并发内核执行情况的唯一方法是分析代码。

使用 wiki 上发布的内部内核启动循环:

# Run kernels many times, we will only keep data from last loop iteration.
for j in range(10):
    for k in range(n):
        event[k]['kernel_begin'].record(stream[k])
        my_kernel(d_data[k], block=(N,1,1), stream=stream[k]) 
    for k in range(n): # Commenting out this line should break concurrency.
        event[k]['kernel_end'].record(stream[k])

配置文件跟踪如下所示:

使用这样的内部内核启动循环(即内核结束事件未在其自己的循环中推送到流中:

# Run kernels many times, we will only keep data from last loop iteration.
for j in range(10):
    for k in range(n):
        event[k]['kernel_begin'].record(stream[k])
        my_kernel(d_data[k], block=(N,1,1), stream=stream[k]) 
#    for k in range(n): # Commenting out this line should break concurrency.
        event[k]['kernel_end'].record(stream[k])

我得到这个配置文件:

即两个执行流中的内核仍然重叠。

所以执行时间在两个例子之间没有变化的原因是因为你所依赖的评论是错误的。这两种情况都会产生内核执行重叠 ("concurrency")。

我没有兴趣了解为什么会这样,但这是您困惑的根源。您将需要在其他地方寻找 中性能不佳的根源(显然不使用流,所以整个问题都是稻草人)。