AMD设备上的物理内存:本地与私有

时间:2012-02-17 16:13:55

标签: architecture opencl gpu gpgpu amd-processor

我正在OpenCL中编写一个算法,我需要每个工作单元记住一部分数据,比如每个内核long[70]long[200]左右。 / p>

最近的AMD设备有32 KiB __local内存,这是(对于每个内核的给定数据量)足以存储20-58个工作单元的信息。但是,根据我从架构(尤其是this drawing)的理解,每个着色器核心还具有专用的私有内存量。然而,我找不到它的大小。

有谁能告诉我如何找出每个内核有多少私有内存?

我对HD7970特别好奇,因为我打算很快购买其中的一些。

编辑:问题已解决,附录D中的答案为here

3 个答案:

答案 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,它在内核占用部分告诉你内核使用了多少空间。