OpenCL:比较在可用平台/设备上添加两个整数数组所需的时间

OpenCL:比较在可用平台/设备上添加两个整数数组所需的时间,c,opencl,C,Opencl,我对整个OpenCL世界都很陌生,所以我正在学习一些初学者教程。我正在尝试合并并比较在不同设备上添加两个阵列所需的时间。然而,我得到了令人困惑的结果。考虑到代码太长,我做了 在我的mac电脑上,我有一个平台和三台设备。当我在中分配j时 cl_command_queue command_queue = clCreateCommandQueue(context, device_id[j], 0, &ret); 手动设置为0,似乎在CPU上运行计算(约5.75秒)。当输入1和2时,计算时间急

我对整个OpenCL世界都很陌生,所以我正在学习一些初学者教程。我正在尝试合并并比较在不同设备上添加两个阵列所需的时间。然而,我得到了令人困惑的结果。考虑到代码太长,我做了

在我的mac电脑上,我有一个平台和三台设备。当我在中分配
j

cl_command_queue command_queue = clCreateCommandQueue(context, device_id[j], 0, &ret);
手动设置为0,似乎在CPU上运行计算(约5.75秒)。当输入1和2时,计算时间急剧下降(0.01076秒)。我认为这是因为计算是在我的英特尔或AMD GPU上运行的。但还有一些问题:

  • 我可以将
    j
    调整到任何更高的数值,它似乎仍然在GPU上运行
  • 当我将所有的计算放在一个循环中时,所有设备的时间测量值与CPU上的计算值相同(如我所言)

  • 在为您遇到的问题提交问题之前,为所有
    0执行计算所需的时间,请始终记住检查错误(特别是在这种情况下,每个API调用都返回
    CL\u SUCCESS
    )。否则结果毫无意义

    在特定情况下,代码中的问题是,当获取设备ID时,您只获取一个设备ID(第60行,第三个参数),这意味着缓冲区中的所有其他内容都是假的,
    j>0
    的结果没有意义

    唯一令人惊讶的是它没有崩溃


    此外,在检查运行时,请使用OpenCL事件,而不是主机端时钟时间。在您的情况下,您至少是在
    clFinish
    之后执行,因此您可以确保内核执行终止,但实际上您是在计算所有设置所需的时间,而不仅仅是复制时间。

    非常感谢您的回复。我正试图实现你所说的,但没有用。如果我理解正确,根据
    clgetDeviceID
    clCreateContext
    中的第三个参数,必须将其更改为平台中可用设备的数量(
    ret_num_devices
    ),但即使在这之后,循环也不能按预期工作。令人惊讶的是,当我将循环替换为j=0,1,2,。。。结果有道理!我想知道你能否直接说出我的要点?我想我已经解决了这个问题。我想知道你是否能很好地看一看,让我知道它是否正确。它现在看起来是正确的。对于上下文,一般来说,您不需要使用所有查询的设备来创建它,但当然,在您的应用程序中,因为您正在测试所有这些设备,所以您也可以按照您的方式进行测试。