为什么PyCuda KernelConcurrency示例的代码不能在“并发”模式下运行得更快?我的GPU应该有足够的资源..。我遗漏了什么?
以下是“并发”版本的输出,第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行注释掉的版本。这不应该再同时运行,而且应该大大地慢一些。在我看来几乎是一样的(两种情况下都是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这里有什么东西我遗漏了吗?还有其他方法来测试并发性吗?
发布于 2016-05-04 07:50:25
真正了解并发内核执行所发生的事情的唯一方法是分析代码。
通过发布在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])我得到了这个侧写:

也就是说,两个执行流中的内核仍然是重叠的。
因此,执行时间在这两个示例之间没有变化的原因是,您所依赖的注释是错误的。这两种情况都会产生内核执行重叠(“并发”)。
我不想知道为什么会这样,但这是你困惑的根源。您需要在其他地方寻找你的代码中性能不佳的根源(显然它并不使用流,所以整个问题都是个草杆)。
https://stackoverflow.com/questions/36995529
复制相似问题