Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencl 如何知道内核是否同时执行?_Opencl - Fatal编程技术网

Opencl 如何知道内核是否同时执行?

Opencl 如何知道内核是否同时执行?,opencl,Opencl,我有一个带有CC 3.0的GPU,所以它应该支持16个并发内核。我通过10次循环通过ClenqueueEndRangeKernel开始10个内核。我如何知道内核是并发执行的 我认为的一种方法是获取NDRangeKernel语句前后的时间。我可能不得不使用事件来确保内核的执行已经完成。但我仍然觉得循环将按顺序启动内核。有人能帮我吗?是的,正如您所建议的,尝试使用事件,并分析所有排队、提交、开始和结束值。这些应该是“设备时间”中的绝对值,您可以看到不同内核的处理(从开始到结束)是否重叠。要确定内核执

我有一个带有CC 3.0的GPU,所以它应该支持16个并发内核。我通过10次循环通过ClenqueueEndRangeKernel开始10个内核。我如何知道内核是并发执行的


我认为的一种方法是获取NDRangeKernel语句前后的时间。我可能不得不使用事件来确保内核的执行已经完成。但我仍然觉得循环将按顺序启动内核。有人能帮我吗?

是的,正如您所建议的,尝试使用事件,并分析所有排队、提交、开始和结束值。这些应该是“设备时间”中的绝对值,您可以看到不同内核的处理(从开始到结束)是否重叠。

要确定内核执行是否重叠,您必须对它们进行分析。这需要几个步骤:

1.创建命令队列 仅当使用属性
CL\u queue\u Profiling\u ENABLE创建命令队列时,才会收集分析数据:

cl_命令_队列[10];
对于(int i=0;i<10;++i){
队列[i]=clCreateCommandQueue(上下文、设备、CL_队列\u分析\u启用、,
&错误代码);
}
2.确保所有内核同时启动 您的假设是正确的,CPU按顺序对内核进行排队。但是,您可以创建单个用户事件并将其添加到所有内核的等待列表中。这会导致内核在用户事件完成之前不会开始运行:

//创建用户事件
cl_事件用户_事件=clCreateUserEvent(上下文和错误代码);
//为内核事件保留空间
cl_事件内核_事件[10];
//排队内核
对于(int i=0;i<10;++i){
ClenqueueEndRangeKernel(队列[i]、内核、工作空间、全局工作偏移、,
全局工作大小、1、用户事件和内核事件[i];
}
//通过完成用户事件启动所有内核
clSetUserEventStatus(用户事件,CL完成);
3.获取分析时间 最后,我们可以收集内核事件的计时信息:

//阻塞,直到所有内核运行完成
clWaitForEvents(10个内核事件);
对于(int i=0;i<10;++i){
cl_ulong启动;
clGetEventProfilingInfo(内核事件[i],CL事件分析命令\u启动,
sizeof(开始),&start,NULL);
乌龙端;
clGetEventProfilingInfo(内核事件[i],CL事件分析命令\U END,
sizeof(结束),&end,NULL);
printf(“事件%d:start=%llu,end=%llu”,i,start,end);
}
4.分析输出 现在您已经有了所有内核运行的开始和结束时间,您可以检查重叠(手动或以编程方式)。输出单位为纳秒。但是请注意,设备计时器仅精确到某一分辨率。您可以使用以下方法查询分辨率:

尺寸分辨率;
clGetDeviceInfo(设备、CL设备、配置文件、计时器、分辨率、,
sizeof(分辨率),&分辨率,NULL);

FWIW,我在一台装有CC 2.0(应该支持并发内核)的NVIDIA设备上尝试了这一点,并观察到内核是按顺序运行的。

通过使用,您可以避免其他答案中建议的所有样板代码(顺便说一句,它们是正确的),这大大简化了这项任务,并为您提供有关OpenCL事件(内核执行、数据传输等)的详细信息,包括一个表和一个用于重叠执行所述事件的绘图


我开发这个库是为了简化其他答案中描述的过程。您可以看到一个基本用法示例。

如果将所有内核放在同一个命令队列中,它们确实会按顺序执行(这就是为什么称为队列)。测量每个内核的时间和总执行时间恐怕是实际测量内核是否并行执行的唯一可能的方法。我已经将所有内核放在不同的命令队列中。您的假设是CUDA Compute Capability 3.0,在费米架构上支持16个CUDA流,是否有OpenCL功能?NVida文件中是否有支持此假设的内容?如果您希望使用OpenCL设备裂变,可以使用clGetDeviceInfo()查询此扩展作为受支持的扩展功能。我在第3.2.2节读了很多关于并发内核支持的内容。我会尝试一下,让你知道结果。就在昨天,当我在谷歌上搜索时,我发现有一种叫做设备裂变的东西,它使我们能够在单个设备上创建子设备,并且我们可以在不同的子设备上执行内核。AMD设备肯定支持设备裂变,但仍然不确定NVIDIA设备是否支持它。我还在读有关它的文章。嗨,我最近用这些步骤来测试我的内核是否同时运行。我使用的是AMDA10APU,我相信它支持并发内核执行。但是分析结果告诉我,内核是一个接一个地执行的,而不是并发执行的。我是否需要启用某些特定选项以使并发内核执行正常工作?我已经在下面的链接上发布了我的代码和输出:这个方法实际上不起作用。首先,默认情况下,队列是按顺序创建的(如本例中所示),但即使您传递了无序标志,运行时也可能决定按顺序运行内核。其次,OpenCL命令队列可能映射到硬件队列,也可能不映射到硬件队列,这取决于您的运行时,因此即使使用单独的队列也可能会给您带来顺序执行。@Mokosha我认为您误解了示例的目的。它展示了一种确定运行时在将一些内核放在多个队列上时是否并发执行它们的方法,我相信这是OP想要知道的。它从不缩进以显示如何实际制作/强制runti