Performance 编译警告OpenCL矩阵多应用程序

Performance 编译警告OpenCL矩阵多应用程序,performance,parallel-processing,opencl,low-latency,pyopencl,Performance,Parallel Processing,Opencl,Low Latency,Pyopencl,为什么这不是矢量化 __attribute__((num_simd_work_items(4))) __attribute__((num_compute_units(2))) __attribute__((reqd_work_group_size(16,16,1))) __kernel void matrix_multiplication(const int fDIM,const int gDIM, const int hDIM, __global float* A, __global flo

为什么这不是矢量化

__attribute__((num_simd_work_items(4)))
__attribute__((num_compute_units(2)))
__attribute__((reqd_work_group_size(16,16,1)))
__kernel void matrix_multiplication(const int fDIM,const int gDIM, const int hDIM,
__global float*  A, __global float* B, __global float* C) {
    int k;
    int i = get_global_id(0);
    int j = get_global_id(1);
    float temp_result;
    if((i < gDIM) && (j<fDIM)){
      temp_result= 0.0f;
        for(k = 0; k<hDIM;k++) {
          temp_result+= A[i*gDIM+k] * B[k*hDIM+j];

        }
      C[i*gDIM+j] = temp_result;

    }
}
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
__属性(数值计算单位(2)))
__属性(需求工作组大小(16,16,1)))
__核空矩阵_乘法(const int fDIM,const int gDIM,const int hDIM,
__全局浮点*A、u全局浮点*B、u全局浮点*C){
int k;
int i=获取全局id(0);
int j=获取全局id(1);
浮动温度结果;
如果((iQ:为什么这矢量化

邪恶是“分支…无法矢量化”-它与此指令相关:

if((i

高效的基于SIMD指令的矢量化意味着所有代码执行流都不是“发散”(分支)的,执行相同的数据/指令(即数据元素SIMD-“粘合”)将数据向量放入足够宽的CPU、SIMD友好寄存器中,通过单个SIMD友好指令立即计算出,也就是说,包中的每个线程SIMD友好指令都是相同的,即不是
如果(){…}否则{…}
-分成不同的,“发散的”针对不同数据元素的不同指令序列流

基本上不可能对对齐到SIMD友好型CPU寄存器中的数据的不同部分执行不同的操作-对于存储到SIMD友好型CPU寄存器中的所有矢量分量,一次只能执行一条SIMD友好型指令

整数和浮点SIMD向量指令的硬件细节各不相同,由此产生的微操作延迟也不同,编译器中SIMD处理器特定的细节确实很重要,但避免不同路径的原则在编译器阶段的自动SIMD向量化中很常见。有关SIMD指令的更多细节及其进一步说明性能限制属性可以从中读取和学习