使用Intel HD Graphics 4000进行OpenCL GPU编程 我一直尝试使用OpenCL C++绑定实现一个简单的并行算法(版本1.2)。 大致如下是c代码(无OpenCL): typedef结构坐标{ 双x; 双y; 双z; }__协调; 类型定义结构节点{ __协调(coord),; 双区; }__节点; 双输入[3]={-1.0,-2,3.5}; //nodeVector1D是结构节点的1Dim随机数组 //nodeVectorSize是上述数组的大小(>1000) 双d=0.0; for(int i=0;i=nodeVectorSize)返回; n=(双*)(nodeVector1D+i*itemsize); 对于(c=0;c

使用Intel HD Graphics 4000进行OpenCL GPU编程 我一直尝试使用OpenCL C++绑定实现一个简单的并行算法(版本1.2)。 大致如下是c代码(无OpenCL): typedef结构坐标{ 双x; 双y; 双z; }__协调; 类型定义结构节点{ __协调(coord),; 双区; }__节点; 双输入[3]={-1.0,-2,3.5}; //nodeVector1D是结构节点的1Dim随机数组 //nodeVectorSize是上述数组的大小(>1000) 双d=0.0; for(int i=0;i=nodeVectorSize)返回; n=(双*)(nodeVector1D+i*itemsize); 对于(c=0;c,c++,macos,opencl,C++,Macos,Opencl,2013年末,我使用MacBook Pro 13英寸,运行在MacOS X Lion上。 OpenCL只检测CPU。 CPU:Intel Ivy i5 2.6GHz,集成GPU 1Gb,1.6GHz(Intel HD Graphics 4000)。 检测到的最大组项大小为1024字节。 当我运行上面的平面代码(1024个节点)时,大约需要17微秒+ 当我使用OpenCL,C++库运行它的并行版本时,它需要10倍长,大约87微秒 (不包括程序创建、缓冲区分配和写入)。 我做错了什么 注意:这个算法

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

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

注意:这个算法的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;

}
\u内核无效\u计算列表(
__全局无效*nodeVector1D,
常量无符号整数nodeVectorSize,
常量unsigned int itemsize,
__全局常量(双*输入){
双d=0。;
int i,c;
双*n;
i=获取全局id(0);
如果(i>=nodeVectorSize)返回;
n=(双*)(nodeVector1D+i*itemsize);
对于(c=0;c我终于找到了问题所在。
问题是Mac OS X上的OpenCL返回的最大设备工作组大小为1024,这是错误的。
我使用不同的工作组大小进行了测试,当使用每个组128个工作项的工作组大小时,性能提高了200%。
这是一幅更清晰的基准图。IGPU代表集成GPU。
(X轴:数组大小,Y轴:以微秒为单位的持续时间)

也许你应该分享你遇到问题的代码,而不是“C++版本”。10 x 17是170,而不是87。这是性能关键代码吗?如果是,你需要给出一个最小的完整示例,以便我们重现问题。几件事:(1)macOS OpenCL实现支持Intel HD Graphics 4000,因此,如果您的设备枚举中没有显示它,您的代码就有问题。您没有共享代码,因此除此之外我没有什么可说的。请注意,OS X 10.7长期不受支持,并且存在各种安全问题,因此您确实不应该这样做(2)如果你的数据集只是一个1000个项目的一次性计算,那么它可能太小而不能看到OpenCL的优点。你的启动和协调开销将超过你的实际算法运行时间。(3)你的内核代码实际上不等同于C++代码:你确实想要<代码>输入[C] -n[C]。
,而不是
连续输入[0]-n[0]
3次。
__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;

}