因为这是我使用的计算机,它有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
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法,还是有更好的方法?
像往常一样,这个问题的答案是:这取决于你的需要.或者换句话说,您需要定义什么是"正确的平台".
以下是我能想到的一些案例(我确信任何人都可以找到其他人):
您使用特定于某个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
).