use*_*449 2 parallel-processing opencl
我正计划深入了解OpenCL,并且一直在阅读OpenCL可以做的事情(只有表面知识),但有一些问题.
假设我有一台AMD Radeon 7750,我有另一台配有AMD Radeon 5870的电脑,并没有计划使用带有Nvidia卡的电脑.我听说优化特定设备的代码会带来性能优势.优化究竟意味着什么?从我所阅读的内容和一些猜测来看,这听起来意味着以一种GPU喜欢的方式编写代码(一般不用担心它是AMD或Nvidia卡)以及匹配方式显卡处理内存(我猜这是特定于计算设备的?或者这只是品牌特定的?).
因此,如果我为Radeon 7750编写代码并对其进行优化,我是否可以使用Radeon 5870将该代码带到另一台计算机上,并且在不更改代码的任何部分的情况下,仍然可以从优化中获得合理的性能优势?如果代码不起作用,将更改代码的一部分是一个小问题,还是会涉及重写足够的代码,以便最好为Radeon 5870编写优化的代码.
如果没有关于您打算编写的算法和应用程序的更多信息,问题就会有点模糊.但是,当我为这两个不同的平台开发代码时,我想我可以为您提供一些高级策略.
Radeon 7750的设计属于新的Graphics Core Next架构,而HD5780则基于较旧的VLIW5(RV770)架构.
为了您的代码对HD5780的硬件表现出色,你必须作出大量使用的包装基本数据类型成为可能,尤其是中int4
,float4
类型.这是因为OpenCL编译器很难自动发现并行性并将数据打包到宽向量中.如果您可以构建代码以便已经考虑到这一点,那么您将能够填充更多的VLIW-5插槽,从而使用更多的流处理器.
GCN更像是NVidia的Fermi架构,其中代码到流处理器的功能单元(ALU等)的路径不经过明确调度的VLIW指令.因此,可以在运行时自动检测更多并行性,并使您的功能单元忙于执行有用的工作,而无需考虑如何实现这一点.
这是一个过于简化的例子来说明我的观点:
// multiply four factors
// A[0] = B[0] * C[0]
// ...
// A[3] = B[3] * C[3];
float *A, *B, *C;
for (i = 0; i < 4; i ++) {
A[i] = B[i] * C[i];
}
Run Code Online (Sandbox Code Playgroud)
该代码可能在GCN架构上运行正常(除了次优的内存访问性能 - 一个高级主题).但是在你的HD5870上这将是一场灾难,因为这四个倍数会占用4个VLIW5指令而不是1个!因此,您可以使用以下float4
类型编写上面的代码:
float4 A, B, C;
A = B * C;
Run Code Online (Sandbox Code Playgroud)
它会在你的两张牌上运行得很好.此外,它会在CPU OpenCL环境中发挥作用,并充分利用MMX/SSE宽寄存器,这是一个奖励.它也更好地利用了内存系统.
当你开始在这两个系统上同时部署代码时,我可以建议你记住使用打包原语的一个简单的例子.
这是另一个更清楚地说明您需要在HD5870上小心的例子.假设我们使用单独的工作单元实现了前面的示例:
// multiply four factors
// as separate work units
// A = B * C
float A, B, C;
A = B * C;
Run Code Online (Sandbox Code Playgroud)
我们有四个独立的工作单位而不是一个.这将是VLIW设备上的绝对灾难,并且将在GCN设备上显示出极好的性能.这是您在编写代码时也想要查找的内容 - 您是否可以使用float4
类型来减少执行相同工作的工作单元的数量?如果是这样,那么您将在两个平台上看到良好的性能.
归档时间: |
|
查看次数: |
444 次 |
最近记录: |