每个GPU设备(AMD,NVidea或任何其他设备)被拆分为多个计算单元(多处理器),每个计算单元具有固定数量的核心(VertexShaders / StreamProcessors)。因此,有一个(Compute Units) x (VertexShaders/compute unit)
个并发处理器可供计算,但每个多处理器只有少量固定数量的__local
内存(通常为16KB或32KB)。因此,这些多处理器的确切数量很重要。
现在我的问题:
CL_DEVICE_MAX_COMPUTE_UNITS
相同吗?我可以从http://en.wikipedia.org/wiki/Comparison_of_AMD_graphics_processing_units?__local
个内存?当然,我可以在运行它的计算机上请求CL_DEVICE_LOCAL_MEM_SIZE
,但我不知道如何从http://www.amd.com/us/products/desktop/graphics/7000/7970/Pages/radeon-7970.aspx#3这样的详细规格表中推断出它? CL_DEVICE_LOCAL_MEM_SIZE
卡是什么?价格并不重要,但64KB(或更大)会为我正在编写的应用程序带来明显的好处,因为我的算法是完全可并行化的,但也是高度内存密集型的,每个MP内部都有随机访问模式(迭代边缘)图表)。答案 0 :(得分:7)
CL_DEVICE_MAX_COMPUTE_UNITS
应该为您提供ComputeUnits的数量,否则您可以从相应的手册(AMD opencl programming guide和Nvidia OpenCL programming guide)对于本地内存的使用,您应该记住每个工作组分配本地内存(并且只能由工作组访问),而计算单元通常可以支持多个工作组。因此,如果您的算法将整个本地内存分配给一个工作组,您将无法使用实现最大并行度。还要注意,由于本地存储器是存储的,因此随机访问将导致很多存储体冲突和扭曲序列化。所以你的算法可能不会像你想象的那样平行(或者可能只会提到可能性)。
使用基于Fermi的卡,如果所有工作组都使用相同的数据(我不知道如何切换L1 /本地内存配置),最好的选择可能是依靠缓存而不是显式本地内存。