OpenCL在第一次函数调用时创建新线程,为什么?
当我调用OpenCL函数时,我不会想象会创建新线程,在本例中,为了简单地获取平台ID,我的程序会创建8个新线程 cl_platform_id platforms[10] = {0}; cl_uint numberofplatforms = 0; clGetPlatformIDs(10, platforms, &numberofplatforms);//this creates 8 threads 由于我没有创建上下文,只是简单地请求平台ID来查看可用的内容,为什么这个函数要创建所有这些线程?我使用Windows 7 64位,I7 920与HT我怀疑它是创建8个线程,因为我有8个内核,英特尔和英伟达SDK我都有一个GTS 250和GTX 560,而我与Nvidia OpenCL库连接并使用它的头。p>OpenCL在第一次函数调用时创建新线程,为什么?,opencl,Opencl,当我调用OpenCL函数时,我不会想象会创建新线程,在本例中,为了简单地获取平台ID,我的程序会创建8个新线程 cl_platform_id platforms[10] = {0}; cl_uint numberofplatforms = 0; clGetPlatformIDs(10, platforms, &numberofplatforms);//this creates 8 threads 由于我没有创建上下文,只是简单地请求平台ID来查看可用的内容,为什么这个函数要创建所
这不是一个大问题,但是如果我在分析了设备之后决定不使用OpenCL,结果却发现有8个无用的线程。有人知道为什么会发生这种情况吗?很多OpenCL函数都是非阻塞的,这意味着它们以队列的形式向设备发出命令,我很确定在宿主程序继续运行其余代码的同时,线程被用来控制设备
举例说明:当您调用ClenqueueEndRangeKernel时,内核不一定立即运行,但程序在ClenqueueEndRangeKernel调用后继续运行代码。因此,我猜这个函数将一些信息传递给控制计算设备的独立线程,并确保内核最终运行。很多OpenCL函数都是非阻塞的,这意味着它们以队列的形式向设备发出命令,我很确定线程用于控制设备,而主机程序继续运行其余代码
举例说明:当您调用ClenqueueEndRangeKernel时,内核不一定立即运行,但程序在ClenqueueEndRangeKernel调用后继续运行代码。因此,我猜这个函数会将一些信息传递给控制计算设备的独立线程,并确保内核最终运行。我猜,通过独立线程监控GPU,与GPU的通信可能会更简单。我猜通过独立线程监控GPU,与GPU的通信可能会更简单。