据我所知,atomicAdd
可用于共享内存和全局内存。我需要从不同块的线程中自动添加浮点数;因此,我需要使用全局临时变量来保存总和。
是否可以从内核内部分配临时全局变量?
当前,我分配一个临时全局变量并将一个指针传递给我的内核。这似乎不是非常用户友好。
TL; DR:要求一个临时变量用于在不同块之间进行原子加法,而无需显式分配全局并将其指针传递给内核
答案 0 :(得分:-1)
您可以在内核代码中使用malloc()
。但是,这样做并不是一个好主意。通常最好在启动内核之前预先分配暂存空间,将其作为参数传递,并让每个线程或一组线程具有一些公式来确定它们将在暂存区域内用于其普通原子的位置。
现在,您已经写的这不是很“用户友好”了;我猜你的意思是对开发人员友好的。好吧,它可以变得更加友好!例如,我的CUDA Modern C++ API wrappers库提供的std::unique_ptr
等效项-但用于设备内存:
#include <cuda/api_wrappers.hpp>
//... etc. etc. ...
{
auto scratch = cuda::memory::device::make_unique<float[]>(1024, my_cude_device_id);
my_kernel<<<blah,blah,blah>>>(output, input, scratch.get();
} // the device memory is released here!
(当然,这是用于同步启动的。)
您可以做的对开发人员更友好的其他事情是使用某种代理功能来获取与特定线程/ warp /线程组/等等相关的暂存器中的位置,该线程/线程使用相同的地址。这至少应该掩盖内核可能正在使用的一些重复的,令人讨厌的地址算法。
也可以选择使用全局__device__
变量(例如提到的@RobertCrovella),但我不鼓励这样做:大小必须在编译时固定,并且您将无法一次从两个内核中使用if,而不会感到痛苦,等等。