在CUDA编程中,计算中间结果后,原子函数是否比reduce更快?
In CUDA programming, is atomic function faster than reducing after calculating the intermediate results?
原子函数(例如atomic_add
)在CUDA编程中广泛用于计数或执行summation/aggregation。但是,我找不到有关原子函数与普通全局内存相比速度的信息read/write。
考虑以下任务,我们要计算一个包含 256K 个元素的浮点数组。每个元素都是先计算出的1000个中间变量的总和。一种方法是使用 atomic_add
;而另一种方法是使用一个 256K*1000 的临时数组作为中间结果,然后减少这个数组(通过求和)。
使用原子函数的第一种方法比第二种方法快吗?
在您的具体情况下,即使您不提供具体程序,也不需要了解任何关于原子操作和非原子操作之间的延迟或带宽差异来排除您的两种方法:它们都是效率很低。
你应该有单个块处理单个输出变量(或少量输出变量),这样每 1,000 个中间变量的总和就不会通过全局内存执行。您可能想阅读 Mark Harris 的“经典”演示文稿:
了解基础知识。由于更新的硬件功能,近年来在这方面有了改进。有关最近的实际实施,请参阅 CUB library's block reduction primitive.
也相关:
如果你这样实现,每个输出元素只会被写入一次。即使 1,000 个中间体的计算需要以某种方式分布在多个块中,无论出于何种原因你没有在问题中分享 - 你仍然应该将它分布在一个较小的数字上,而不是 1,000,以便全局内存写入结果的一部分只占总计算时间的一小部分,因此不值得为原子加法以外的事情操心。
原子函数(例如atomic_add
)在CUDA编程中广泛用于计数或执行summation/aggregation。但是,我找不到有关原子函数与普通全局内存相比速度的信息read/write。
考虑以下任务,我们要计算一个包含 256K 个元素的浮点数组。每个元素都是先计算出的1000个中间变量的总和。一种方法是使用 atomic_add
;而另一种方法是使用一个 256K*1000 的临时数组作为中间结果,然后减少这个数组(通过求和)。
使用原子函数的第一种方法比第二种方法快吗?
在您的具体情况下,即使您不提供具体程序,也不需要了解任何关于原子操作和非原子操作之间的延迟或带宽差异来排除您的两种方法:它们都是效率很低。
你应该有单个块处理单个输出变量(或少量输出变量),这样每 1,000 个中间变量的总和就不会通过全局内存执行。您可能想阅读 Mark Harris 的“经典”演示文稿:
了解基础知识。由于更新的硬件功能,近年来在这方面有了改进。有关最近的实际实施,请参阅 CUB library's block reduction primitive.
也相关:
如果你这样实现,每个输出元素只会被写入一次。即使 1,000 个中间体的计算需要以某种方式分布在多个块中,无论出于何种原因你没有在问题中分享 - 你仍然应该将它分布在一个较小的数字上,而不是 1,000,以便全局内存写入结果的一部分只占总计算时间的一小部分,因此不值得为原子加法以外的事情操心。