3

Because this is the computer I am using it has AMD, NVIDEA, and Intel platforms. How can I know which is the right platform to use on a users computer? What I have now is a loop that tries to create a platform, device, context, and queue for every platform. If it fails at any point it tries the next platform.

    readKernel();

    numPlatforms = getNumPlatforms(); TEST
    platforms = getPlatforms(); TEST
    for(int i = 0; i < numPlatforms; i++)
    {
        numDevices = getNumDevices(platforms[i]); TEST_AND_CONTINUE
        devices = getDevices(platforms[i], numDevices); TEST_AND_CONTINUE
        context = createContext(platforms[i], devices); TEST_AND_CONTINUE
        queue = getCommandQueue(context, devices[0]); TEST_AND_CONTINUE

        // all setup. can post info here ->  getDeviceInfo(devices[0]);
        break; 
    }
    program = createProgram(context, source); TEST
    buildProgram(program); TEST
    kernel = buildKernel(program, appName); TEST

Is that a good way to do it or is there a better way?

4

2 回答 2

8

与此类问题一样,答案是:这取决于您的需要。或者换句话说,您需要定义什么是“正确的平台”。

以下是我能想到的一些案例(我相信任何人都可以找到其他案例):

  • 您使用特定于某个 OCL 版本的某些功能开发了内核。使用clGetPlatformInfo,您可以查询存在的每个平台以找到具有正确 OCL 版本的平台。

  • 您针对特定类型的设备(CPU、GPU)优化了内核。CL_DEVICE_TYPE_TYPENAME您可以使用适当的标志 ( )过滤您感兴趣的设备clGetDeviceIDs

  • 您希望尽可能多地并行化计算,但您必须将大量数据移动到设备。在这种情况下,您可能会发现在 iGPU 上运行内核可以获得最佳性能。由于该功能clGetDeviceInfo和标志CL_DEVICE_HOST_UNIFIED_MEMORY,您可以确定您是否有这样的设备可用。

  • 使用该clGetDeviceInfo功能,您还可以查询要使用的特定供应商扩展(标志:)CL_DEVICE_EXTENSIONS。请注意,clGetPlatformInfo它还提供了平台支持的扩展列表。

  • 您有多个可用的 GPU,并且您想要一个具有“最佳性能”的 GPU。您仍然clGetDeviceInfo可以查询设备的某些规格。根据这些规格,您可以做出选择。例如,您可以查明设备是否有缓存 ( CL_DEVICE_GLOBAL_MEM_CACHE_TYPE),如果有,有多少 ( CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE)。您还可以查询时钟频率 ( CL_DEVICE_MAX_CLOCK_FREQUENCY) 或设备上可用的计算单元数 ( CL_DEVICE_MAX_COMPUTE_UNITS)。

于 2013-09-04T00:03:17.420 回答
4

通常一个很好的常见用例是:

  1. 获取所有平台
  2. 获取每个平台的 GPU 和 CPU/其他设备,将它们分成 2 个数组。
  3. 是否有可用的 GPU 设备?选择该平台和设备
  4. 是否有可用的 CPU/其他设备?选择该平台和设备

您可以细化第 3 点和第 4 点,根据您的需要使用clGetDeviceInfo().

于 2013-09-04T08:42:45.850 回答