我正在OpenCL中编写一个算法,我需要每个工作单元记住一部分数据,比如每个内核long[70]
和long[200]
左右。 / p>
最近的AMD设备有32 KiB __local
内存,这是(对于每个内核的给定数据量)足以存储20-58个工作单元的信息。但是,根据我从架构(尤其是this drawing)的理解,每个着色器核心还具有专用的私有内存量。然而,我找不到它的大小。
有谁能告诉我如何找出每个内核有多少私有内存?
我对HD7970特别好奇,因为我打算很快购买其中的一些。
编辑:问题已解决,附录D中的答案为here。
答案 0 :(得分:4)
答案是由评论中的用户talonmies给出的,所以我会在这里写一个新的答案来解决这个问题。
这些值可以在AMD APP OpenCL编程指南http://developer.amd.com/sdks/amdappsdk/assets/amd_accelerated_parallel_processing_opencl_programming_guide.pdf的附录D中找到(nVidia存在类似的文档)。显然,AMD设备的寄存器为128位(4x32),所有现代高端设备都有16384个寄存器,因此每个计算单元的寄存器数为256KB。
答案 1 :(得分:0)
我认为你正在寻找__本地记忆。这就是32KB的本地数据存储所指的内容。我不认为你可以轮询设备以获得私人内存金额。
您可以传入NULL long * cl_mem引用来分配内存。我认为每个WI最好使用静态内存量。假设每个工作项需要很长[200],您可以使用下面的代码。将工作分成具有相同(或类似)内存要求的组也是一个好主意,以便充分利用LDS内存。
void __kernel(__local long* localMem, const int localMemPerItem
//more args...
)
{
//host has 'passed' localMemPerItem*get_local_size() long values in as locamMem
//this work item has access to all of it, but can choose to restrict
//itself to only the portion it needs.
//work group size will be limited to CL_DEVICE_LOCAL_MEM_SIZE/(8*localMemPerItem)
int startIndex=localMemPerItem*get_local_id(0);
//use localMem[startIndex+ ... ]
}
答案 2 :(得分:0)
为了回答79xx系列卡中寄存器文件的大小,因为它基于GCN架构,因此根据anandtech中的图像为64KB:http://www.anandtech.com/print/5261
回答你的问题如何找出每个内核使用多少内存..你可以在你的内核上运行AMD APP Profiler,它在内核占用部分告诉你内核使用了多少空间。