使用Intel HD Graphics 4000的OpenCL GPU编程

时间:2018-09-05 15:36:17

标签: c++ macos opencl

我一直在尝试使用OpenCL c ++绑定(版本1.2)实现简单的并行算法。 大致上是C代码(没有OpenCL):

typedef struct coord{
    double _x;
    double _y;
    double _z;
}__coord;

typedef struct node{
    __coord _coord;
     double _dist;
} __node;
double input[3] = {-1.0, -2, 3.5};
//nodeVector1D is a 1Dim random array of struct __node
//nodeVectorSize is the Size of the above array (>1,000)
double d = 0.0;
     for(int i=0; i < nodeVectorSize; i++){
         __node n = nodeVector1D[i];
         d += (input[0] - n._coord._x)*(input[0] - n._coord._x);
         d += (input[1] - n._coord._y)*(input[1] - n._coord._y);
         d += (input[2] - n._coord._z)*(input[2] - n._coord._z);
         n._dist = d;
     }

我使用2013年底在Mac Os X Lion上运行的MacBook Pro 13“。 OpenCL仅检测CPU。 CPU:Intel Ivy i5 2.6GHz,具有1.6Gb / h的1Gb集成GPU(Intel HD Graphics 4000)。 检测到的最大组项目大小为1024字节。 当我运行上面的平面代码(具有1024个节点)时,大约需要17微秒。+

当我使用OpenCL,C ++库运行其并行版本时,它需要10倍的时间,大约为87微秒 (不包括程序创建,缓冲区分配和写入)。 我在这里做什么错了?

NB:该算法的OpenCL内核很明显可以猜测,但是我可以在需要时发布它。 预先感谢。

编辑N#1:内核代码

__kernel void  _computeDist(
   __global void* nodeVector1D,
   const unsigned int nodeVectorSize,
   const unsigned int itemsize, 
   __global const double* input){
    double d = 0.;
    int i,c;
    double* n;
    i = get_global_id(0);
    if (i >= nodeVectorSize) return;
    n = (double*)(nodeVector1D + i*itemsize);
    for (c=0; c<3;c++){
        d += (input[c] - n[c])*(input[c] - n[c]);
    }
    n[3] = d;

}

对空指针算法很抱歉,但是它可以工作(默认没有seg)。 我也可以发布OpenCL初始化例程,但我认为它遍及Internet。但是,如果有人问我,我会发布它。

@pmdj:如上所述,OpenCL可以识别我的CPU,否则我将无法运行测试并获得上面显示的性能结果。

@pmdj:据我所知,OpenCL内核代码始终是用C编写的。但是,我标记了C ++,因为(如上所述),我使用的是OpenCL C ++绑定。

1 个答案:

答案 0 :(得分:0)

我终于找到了问题。 问题是Mac OS X上的OpenCL返回错误的最大设备工作组大小1024。 我使用各种工作组规模进行了测试,最终在每个组使用128个工作项的工作组中获得了200%的性能提升。 这是一个更清晰的基准图。 IGPU代表集成GPU。 (X轴:数组大小,Y轴:持续时间(以微秒为单位)) enter image description here