为什么在每个clEnqueue函数中都调用clGetPlatformInfo?

问题描述 投票:0回答:1

我们正在分析在主机和设备上的NVidia GPU上运行的OpenCL应用程序。我们惊讶地发现(基于gperftools)主机在clGetPlatformInfo中花费了其44%的时间,该方法在我们自己的代码中仅被调用一次。它由clEnqueueCopyBuffer_hidclEnqueueWriteBuffer_hidclEnqueueNDRangeKernel_hid调用(可能还有所有其他clEnqueue方法,但在我们的代码中很少调用它们)。由于这占用了我们大量的主机时间,并且我们现在似乎受到主机速度的束缚,因此我需要知道是否有消除这些额外呼叫的方法。

为什么每个OpenCL调用都会调用它? (大概是可以在上下文中存储的静态信息?)我们是否可能不正确地初始化了上下文?

供参考,这是我们初始化上下文的方式:

vector<cl_context_properties> const contextProperties = {
    CL_CONTEXT_PLATFORM, (cl_context_properties) m_platformId, 0};

m_context = clCreateContext (
    contextProperties.data (),
    1,
    &m_deviceId,
    &deviceContextCallback,
    nullptr,
    &errorCode);
profiling opencl
1个回答
0
投票

尝试将NULL作为第一个参数传递给clCreateContext。设备ID已被传递,因此可能不需要第一个参数,并且可能导致对clGetPlatformInfo的这些额外调用。

另一种尝试是与非Nvidia OpenCL库链接。不需要使用GPU供应商的OpenCL库,只要您使用的功能已在此其他OpenCL库中实现,任何方法都可以使用。使用Nvidia不会有风险,因为到目前为止,最新支持的版本是OpenCL 1.2,大多数(如果不是所有)供应商都已支持该版本。因此,您可以尝试使用其他供应商的SDK(例如Intel或AMD)中的OpenCL lib。如果您使用的是Ubuntu,则可以使用ocl-icd-opencl-dev

© www.soinside.com 2019 - 2024. All rights reserved.