我应该如何在OpenCL中声明一个可以充分利用GPU';s矢量化特征

我应该如何在OpenCL中声明一个可以充分利用GPU';s矢量化特征,opencl,gpu,vectorization,amd-processor,Opencl,Gpu,Vectorization,Amd Processor,我正在使用AMD-APP(1214.3)。我在OpenCL中的代码如下: // W is an uint4 variable uint4 T = (uint4)(1U, 2U, 3U, 4U); T += W; // outside function scope __constant uint4 X = (uint4)(1U, 2U, 3U, 4U); // inside function uint4 T = X; T += W; 或者我也尝试过使用如下常量数据 // W is an uin

我正在使用AMD-APP(1214.3)。我在OpenCL中的代码如下:

// W is an uint4 variable
uint4 T = (uint4)(1U, 2U, 3U, 4U);
T += W;
// outside function scope
__constant uint4 X = (uint4)(1U, 2U, 3U, 4U);
// inside function
uint4 T = X;
T += W;
或者我也尝试过使用如下常量数据

// W is an uint4 variable
uint4 T = (uint4)(1U, 2U, 3U, 4U);
T += W;
// outside function scope
__constant uint4 X = (uint4)(1U, 2U, 3U, 4U);
// inside function
uint4 T = X;
T += W;
然而,在编译之后,我看到汇编代码包含多个加法指令,以形成uint向量

dcl_literal l16, 0x00000001, 0x00000001, 0x00000001, 0x00000001
dcl_literal l19, 0x00000002, 0x00000002, 0x00000002, 0x00000002
dcl_literal l18, 0x00000003, 0x00000003, 0x00000003, 0x00000003
dcl_literal l17, 0x00000004, 0x00000004, 0x00000004, 0x00000004
    mov r66, l16
    iadd r66, r66.xyz0, l17.000x
    iadd r66, r66.xy0w, l18.00x0
    iadd r66, r66.x0zw, l19.0x00
    iadd r75, r75, r66
那么,如何在OpenCL中编写向量初始化代码以实现更少的指令呢。例如,先加载一条指令,然后加载iadd,如下所示

dcl_literal l16, 0x00000001, 0x00000002, 0x00000003, 0x00000004
   move r66, l16
   iadd r75, r75, r66
谢谢您的帮助。

您在中看到了什么

dcl_literal l16, 0x00000001, 0x00000001, 0x00000001, 0x00000001
...
似乎是LLVM汇编程序。它是编译器前端的输出,尚未被后端处理并转换为机器代码。由于它不是最终版本,因此,在我看来,没有任何措施来确定这段代码的优化程度

作为建议-这种LLVM表示可以用于更好地向后兼容遗留体系结构,因为它看起来像VLIW指令代码


回到OpenCL性能。一个IO操作花费的时间太长,所有的精力都投入到更小的指令级优化上,这只是浪费时间。这就是GPGPU性能通常受带宽限制的原因。

如今,大多数GPU都是超标量的,要让GPU在每个时钟周期中做最多有用的工作,最好的办法就是放弃必须巧妙地调度向量指令。它们被设计为并行运行大量标量指令,因此我希望看到标量GPU的反汇编代码正是以这种方式工作的。您是在启用还是禁用优化的情况下编译的?仅为编译器指令指定了
-D
-cl opt disable
clBuildProgram
中使用的“-O0”都不是。您使用的是哪种AMD GPU?是基于VLIW(5xxx,6xxx)还是基于GCN(7xxx)?只有前者将创建向量指令。我使用的是HD78XX GPU。根据AMD OpenCL编程指南,使用4宽度向量类型(int4、float4等)是首选。但是,当我声明
uint4
类型时,生成的IL
dcl_literal
就像第一个汇编代码一样,它重复了4次,并使用4个宽度的literal来表示我的一个
uint4
变量。然而,我确实看到一些IL的常量文字看起来像我的第二个汇编代码,其中包含4个不同的十六进制数。但这些常量文字不是我的显式代码,因为我在OpenCL源代码中找不到这样的数字。然而,我认为编译器和GPU可以支持这样的IL。