有没有一种好方法可以动态选择合适的平台?

时间:2013-09-03 22:30:06

标签: opencl

因为这是我使用的计算机,它有AMD,NVIDEA和Intel平台。我怎么知道哪个是在用户计算机上使用的正确平台?我现在拥有的是一个循环,它试图为每个平台创建一个平台,设备,上下文和队列。如果它在任何时候失败,它会尝试下一个平台。

    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

这是一个很好的方法,还是有更好的方法?

2 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:4)

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

  1. 获取所有平台
  2. 获取每个平台GPU和CPU /其他设备,将它们分成2个阵列。
  3. 有可用的GPU设备吗?选择该平台和设备
  4. 是否有可用的CPU /其他设备?选择该平台和设备
  5. 您可以优化3点和4点,根据您的需要选择最好的GPU设备clGetDeviceInfo()