【问题标题】:OpenCL GPU Programming with Intel HD Graphics 4000使用 Intel HD Graphics 4000 进行 OpenCL GPU 编程
【发布时间】:2019-02-10 19:43:28
【问题描述】:

我一直在尝试使用 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;
     }

我使用 MacBook Pro 13" Late 2013,在 Mac Os X Lion 上运行。 OpenCL 只检测 CPU。 CPU:Intel Ivy i5 2.6GHz,具有 1Gb at 1.6Ghz 的集成 GPU(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;

}

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

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

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

【问题讨论】:

  • 也许您应该分享您遇到问题的代码,而不是“C++ 版本”。
  • 10 x 17 是 170,而不是 87。这是性能关键代码吗?如果是这样,您需要提供一个最少且完整的示例,以便我们重现问题。
  • 一些事情:(1) macOS OpenCL 实现支持 Intel HD Graphics 4000,所以如果它没有出现在您的设备枚举中,那么您的代码就存在问题.你还没有分享你的代码,所以除此之外我无话可说。请注意,OS X 10.7 早已失去支持,并且存在各种安全问题,因此您真的不应该再使用它了。 (2) 如果您的数据集只是一次性计算 1000 项,那可能太小而看不到 OpenCL 的优势。您的启动和协调开销将超过您的实际算法运行时间。
  • (3) 你的内核代码实际上并不等同于 C++ 代码:你肯定想要 input[c] - n[c],而不是 input[0] - n[0] 连续 3 次。

标签: c++ macos opencl


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2015-01-10
    • 2012-08-13
    相关资源
    最近更新 更多