我正在使用 OpenCL 和 JOCL 在 GPU 上执行并行内核。
我想知道:
1/ 是否有任何功能可以了解工作项和工作组的内核大小以及它是如何在我的 Nvidia GPU 平台上执行的?
2/是否有可能在没有 GPU/CPU 数据传输的情况下知道内核的执行时间,因为?我在启动内核之前和之后使用了 java 工具System.currentTimeMillis();
,但它包括数据传输时间。
3/更准确地说,有没有可能知道每个 GPU 核心的执行时间?
1)在内核中,
get_global_size(0) gives number of items in x dimension
get_global_size(1) gives number of item arrays in y dimension
get_global_size(2) gives number of item matrices in z dimension
总数是它们的乘积,但如果内核仅启动 1-dim,那么只有第一个函数就足够了。
get_local_size(0 or 1 or 2);
为组中的项目提供相同的东西,而不是总项目。
get_num_groups (0 or 1 or 2)
相似,但给出了总组中的组数。
维数取自
int dims=get_work_dim ()
2)来自主机代码的基于事件的性能查询:
http://www.jocl.org/cloth/docs/doc-utils/org/jocl/utils/Events.html
computeExecutionTimeMs(org.jocl.cl_event event) 计算给定事件的执行时间,以毫秒为单位。
1)、2) 和 3) 分析器
可以显示除“每个核心”之外的所有内容(但提供“通道”的信息,这些信息可能不会始终映射到同一个核心,但您可以看到单个线程在做什么)部分。https://developer.nvidia.com/nvidia-nsight-visual-studio-edition 视觉效果和表格提供了有关瓶颈和内核热点的足够信息