如何在向量处理器SIMD的opencl中添加向量int16的所有元素?

问题描述

在SIMD上进行矩阵乘法时,我在添加向量的所有元素时都遇到了问题。

float16 sum = row * column;

现在,总和是16个值的向量变量。我想为矩阵乘法添加所有值。 在opencl或Mac单元中是否有内置功能

PS:点功能仅适用于float4

解决方法

假设您要对每个GPU线程对不同数据执行矩阵向量乘法y=M*x,则可以手动执行float16点积:

float sum = row.s0*column.s0+row.s1*column.s1+...+row.sf*column.sf;

但是,这里更好的解决方案是完全放弃OpenCL矢量数据类型,而改为使用float。然后y=M*x的实现如下:

#define def_dim 16 // matrix dimension
float M[def_dim*def_dim]; // matrix
float x[def_dim]; // input vector

// fill M and x wih data

float y[def_dim]; // result vector
#pragma unroll // improve performance by loop unrolling
for(uint i=0; i<def_dim; i++) {
    y[i] = 0.0f;
    #pragma unroll // inprove performance by loop unrolling
    for(uint j=0; j<def_dim; j++) y[i] = fma(M[i*def_dim+j],x[j],y[i]); // multiply y=M*x
}
,

因此要添加vector的元素,请分别添加所有元素。 到目前为止,尚无来自opencl的标准功能。

        // Adding all the elements of the vector
        desiredSum += sum.s0;
        desiredSum += sum.s1;
        desiredSum += sum.s2;
        desiredSum += sum.s3;
        desiredSum += sum.s4;
        desiredSum += sum.s5;
        desiredSum += sum.s6;
        desiredSum += sum.s7;
        desiredSum += sum.s8;
        desiredSum += sum.s9;
        desiredSum += sum.sa;
        desiredSum += sum.sb;
        desiredSum += sum.sc;
        desiredSum += sum.sd;
        desiredSum += sum.se;
        desiredSum += sum.sf;