gpu中的时间测量执行和分配
time measurement execution and allocation in gpu
我正在使用 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 事件)
计算给定事件的执行时间,以毫秒为单位。
1)、2) 和 3) 分析器
可以显示除 "each core" 之外的所有部分(但提供 "Lanes" 的信息可能不会始终映射到同一核心,但您可以看到单个线程在做什么)部分。 https://developer.nvidia.com/nvidia-nsight-visual-studio-edition 视觉效果和表格提供了有关瓶颈和内核热点的足够信息
我正在使用 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 事件) 计算给定事件的执行时间,以毫秒为单位。
1)、2) 和 3) 分析器
可以显示除 "each core" 之外的所有部分(但提供 "Lanes" 的信息可能不会始终映射到同一核心,但您可以看到单个线程在做什么)部分。 https://developer.nvidia.com/nvidia-nsight-visual-studio-edition 视觉效果和表格提供了有关瓶颈和内核热点的足够信息