【发布时间】:2012-03-09 01:20:57
【问题描述】:
我正在 OpenCL 中编写一个算法,在该算法中,我需要每个工作单元记住相当一部分数据,例如每个内核之间的 long[70] 和 long[200] 左右。
最近的 AMD 设备有 32 KiB __local 内存,这(对于每个内核的给定数据量)足以存储 20-58 个工作单元的信息。但是,根据我对架构的了解(尤其是从this drawing),每个着色器核心也有专用数量的私有内存。但是我找不到它的大小。
谁能告诉我如何找出每个内核有多少私有内存?
我对 HD7970 特别好奇,因为我打算很快购买其中一些。
编辑:问题已解决,答案是附录 D 中的here。
【问题讨论】:
-
我不相信私有内存是每个内核专用的 - 它映射到寄存器文件,它是每个计算单元资源的。每个工作项都从计算单元寄存器文件中分配寄存器,需要多少决定了在任何给定时刻飞行的波前数量。
-
从著名的随处可见的绘图codeproject.com/KB/showcase/Memory-Spaces/image001.jpg 得出结论,私有内存在物理上与__local 内存不同,不是吗?
-
是的,它们在物理上是不同的。在大多数现代 AMD 设备中,私有内存映射到计算单元寄存器文件,本地内存映射到计算单元级共享内存。一些早期的 OpenCL 兼容 GPU 没有共享内存,而本地内存只是 SDRAM。也不是每个核心,每个工作项对私有和每个工作组使用多少本地效果,每个计算单元运行的并发波前数量。
-
你还没有理解,我认为 - 私有内存(就像名字所说的那样)是每个工作项的私有内存。但它是从计算单元寄存器文件中分配给每个工作项的,该文件充当在给定计算单元上运行的所有工作项的公共资源池。而且我很确定 AMD 的编译器对每个工作单元设置了 256 个寄存器的硬性限制,而与 GPU 上寄存器文件的大小无关。
-
我认为每个寄存器都是一个 32 位的字。但请记住,代码中的所有其他变量也使用寄存器。我想我记得典型的 AMD GPU 每个计算单元有一个 64kb 的寄存器文件,需要由至少 4 或 8 个波前共享,每个波前有 64 个工作项。但我不太使用他们的硬件,所以这可能不正确。查看其 OpenCL SDK 中的当前发行说明。
标签: architecture opencl gpu gpgpu amd-processor