【发布时间】:2014-09-11 17:57:42
【问题描述】:
我有四个作业(分为两个任务)需要在 AMD OpenCl 设备和 GPU 设备上并行执行。据我所知,如果通过了 NULL 事件,则为 AMD OpenCl CPU 设备调用 NDRangeKernel 会立即返回(非阻塞)。
任务1 因此,首先我为 AMD OpenCl CPU 设备调用 NDRangeKernel,为 job1 调用 NDRangeKernel,之后主机将立即获得控制权。
ret = clEnqueueNDRangeKernel(command_queue_amd, icm_kernel_amd, 1, NULL, &glob, &local, 0, NULL, NULL);
任务2 然后主机可以为 GPU 设备调用 NDRangeKernel,使用 gpu 内核 1 调用 job2,然后调用 gpu 内核 2 调用 job3,然后调用 gpu 内核 3 调用 job4。
ret = clEnqueueNDRangeKernel(command_queue_gpu, icm_kernel_gpu[0], 1, NULL, &glob, &local, 0, NULL, NULL);
ret = clEnqueueNDRangeKernel(command_queue_gpu, icm_kernel_gpu[1], 1, NULL, &glob, &local, 0, NULL, NULL);
ret = clEnqueueNDRangeKernel(command_queue_gpu, icm_kernel_gpu[2], 1, NULL, &glob, &local, 0, NULL, NULL);
他们没有及时返回宿主。
然后为 GPU 读取缓冲区,然后为 CPU。
ret = clEnqueueReadBuffer(command_queue_gpu, Buffer_gpu, CL_TRUE, 0, count * sizeof(double), arr_gpu, 0, NULL, NULL);
ret = clEnqueueReadBuffer(command_queue_amd, Buffer_amd, CL_TRUE, 0, count * sizeof(double), arr_cpu, 0, NULL, NULL);
我的问题是,这两个任务是否并行运行?是否有任何探查器/逻辑来检测这种行为?任何评论/逻辑/指针将不胜感激。
【问题讨论】:
-
你怎么知道他们没有及时返回?该调用需要一些时间来完成排队过程,但这并不意味着它是一个阻塞调用。您应该在通话后检查通话事件以查看其状态。顺便说一句:内核永远不会在设备中并行运行,只有内核调用中的 WI 并行运行。
-
是的 @DarkZeros 内核从不并行运行。但这适用于不同的设备吗?就我而言,设备是不同的。我对 GPU 设备也有同样的期待,但我只是建议 AMD OpenCL 设备与 1 个内核分开,而 GPU 设备与 3 个内核分开运行?因此我的查询是,两个设备是否都在并行执行?
-
您在所有 GPU 案例中使用相同的队列 @987654324@,因此,无论您启动 1、3 还是 1k 内核,它们都将是串行的。至于 CPU 和 GPU 设备,是的,它们确实并行运行(通过查看事件数据来检查)。
-
这回答了我的问题。请将其发布在答案栏中,以便我标记它。
标签: opencl