CL_DEVICE_NAME = GeForce GT 630
CL_DEVICE_TYPE = CL_DEVICE_TYPE_GPU
CL_PLATFORM_NAME:NVIDIA CUDA
size_t global_item_size = 8;
size_t local_item_size = 1;
clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL, &global_item_size, &local_item_size, 0, NULL, NULL);
这里,不允许在内核中打印。因此,如何确保我的所有8个内核并行运行?
额外信息(关于我的问题):对于内核,我传递输入和输出8X8大小的数组作为缓冲区。根据工作项目编号,我正在解决该行并将结果保存在输出缓冲区中。之后我正在阅读结果。
如果我正在运行AMD平台SDK,我将在
中添加内核中的print语句#pragma OPENCL EXTENSION cl_amd_printf : enable
因此我可以清楚地看到,如果我使用4核心机器,我的前4个核心并行运行,然后休息将并行运行,这表明它并行解决了最多4个核心。
但是,我如何才能看到我的CL_DEVICE_TYPE_GPU?
任何帮助/指针/建议都将不胜感激。
答案 0 :(得分:1)
使用printf
并不是确定代码是否实际并行执行的可靠方法。例如,您可以在一个内核上同时运行4个线程,并且仍然会以非确定性顺序输出printf
语句作为它们之间的CPU时间片。实际上,OpenCL 1.2 specification(" printf输出同步")的第6.12.13.1节明确指出不能保证输出的写入顺序。
听起来你真正追求的是一个指标,可以告诉你设备的使用情况,这与确定某些工作项是否实际并行执行不同。执行此操作的最佳方法是使用分析器,该分析器通常包含此类度量标准。不幸的是,NVIDIA的NVVP不再适用于OpenCL,因此这对您没有任何帮助。
在NVIDIA硬件上,工作组中的工作项分为32个组,称为warp。每个warp都以SIMD方式执行,因此warp中的32个工作项以锁步方式执行。您通常会在每个计算单元上驻留许多warp,可能来自多个工作组。计算单元将根据需要透明地在这些warp之间进行上下文切换,以便在warp停止时保持处理元素的忙碌。
您的简短代码段表示您要求工作组大小为1的8个工作项。我不知道这只是一个示例,但如果它不是,那么这个几乎肯定会在GPU上提供相当差的性能。根据以上所述,您确实希望工作组大小为32的倍数,以便GPU可以填充每个warp。此外,您需要全局大小的数百个工作项(NDRange)才能正确填充GPU。运行如此小的问题大小并不能很好地说明GPU的性能。
答案 1 :(得分:1)
如果你要排队足够的工作项目(至少32个,但理想情况下数千个),那么你的工作项目将并行运行"。
您可以使用分析工具查看内核的执行细节,例如NVIDIA硬件上的Parallel Nsight或AMD硬件上的CodeXL。它将告诉您有关硬件占用率和执行速度的信息。您还可以看到内存传输。