每个GPU设备(AMD,NVidea或任何其他设备)被分成几个计算单元(MultiProcessors),每个计算单元具有固定数量的核心(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在购买之前,我怎么知道GPU上每个MP有多少内存?当然我可以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内部都有随机访问模式(迭代边缘)图表).CL_DEVICE_MAX_COMPUTE_UNITS应该给你ComputeUnits的数量,否则你可以从适当的手册(AMD opencl编程指南和Nvidia OpenCL编程指南)浏览它但是,对于本地内存的使用,您应该记住每个工作组分配本地内存(并且只能由工作组访问),而计算单元通常可以支持多个工作组.因此,如果您的算法将整个本地内存分配给一个工作组,您将无法使用实现最大并行度.还要注意,由于本地存储器是存储的,因此随机访问将导致很多存储体冲突和扭曲序列化.所以你的算法可能不会像你想象的那样平行(或者可能只会提到可能性).
使用基于Fermi的卡,如果所有工作组都使用相同的数据(我不知道如何切换L1 /本地内存配置),那么最好的选择可能是依靠缓存而不是显式本地内存.
| 归档时间: |
|
| 查看次数: |
8166 次 |
| 最近记录: |