Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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
Cuda 如何理解;“隐式同步”;对于并发内核_Cuda - Fatal编程技术网

Cuda 如何理解;“隐式同步”;对于并发内核

Cuda 如何理解;“隐式同步”;对于并发内核,cuda,Cuda,在Nvida CUDA C编程指南4.0第3.2.5.5.4节中,它指出,如果在不同流之间发出设备到设备内存拷贝,则来自不同流的两个命令不能同时运行。我不知道它到底是什么意思。希望有人能澄清我的困惑 假设我的程序有两个流,流0和流1。下面是向这些流启动内核的顺序 内核0.0(流0;假设执行时间为10毫秒) 内核1.0(流1;假设执行时间为1ms) 内核1.1(流1;假设执行时间为3毫秒) 内核1.2(流1;此内核导致设备到设备内存拷贝,假设执行时间为1ms) 内核1.3(流1;假设执行时间为6毫

在Nvida CUDA C编程指南4.0第3.2.5.5.4节中,它指出,如果在不同流之间发出设备到设备内存拷贝,则来自不同流的两个命令不能同时运行。我不知道它到底是什么意思。希望有人能澄清我的困惑

假设我的程序有两个流,流0和流1。下面是向这些流启动内核的顺序

内核0.0(流0;假设执行时间为10毫秒)

内核1.0(流1;假设执行时间为1ms)

内核1.1(流1;假设执行时间为3毫秒)

内核1.2(流1;此内核导致设备到设备内存拷贝,假设执行时间为1ms)

内核1.3(流1;假设执行时间为6毫秒)


我们还假设程序没有其他开销,并且GPU有足够的SM并发运行这些内核。我的问题是,内核0.0是否可以与内核1.2和内核1.3同时运行?整个程序的运行时间是多少?

如前所述,使用主机上的
cudaMemcpy()
完成设备到设备的内存复制;内核可以随意读写全局内存。如果内核在不同的流中,它们可能会重叠,但不能保证。准确的加速将取决于每个内核的SM利用率。Nvidia建议使用事件来计时内核执行(启动和停止计时器),以确定重叠版本是否比顺序版本快。您可以将此输出与将内核切换到流0或在分析器中运行应用程序进行比较,后者序列化内核执行。

如上所述,使用主机上的
cudaMemcpy()
完成设备到设备的内存复制;内核可以随意读写全局内存。如果内核在不同的流中,它们可能会重叠,但不能保证。准确的加速将取决于每个内核的SM利用率。Nvidia建议使用事件来计时内核执行(启动和停止计时器),以确定重叠版本是否比顺序版本快。您可以将此输出与将内核切换到流0或在分析器中运行应用程序进行比较,后者序列化内核执行。

内核1.2如何“导致”设备到设备内存复制?要做到这一点,您需要使用主机API调用,如cudaMemcpyThanks,以获得快速响应。这就是我困惑的地方。在我的内核1.2中,我有一些指令将一些数据从某个内存位置复制到另一个内存位置。这就是我所说的“内核1.2导致设备到设备的内存拷贝”。我猜你会说流0中的内核和流1中的内核可以并发运行,对吗?大概你们所有的内核都读写全局内存,否则你会运行什么?这不是设备到设备的内存拷贝。我明白了。根据我的测量,顺序运行这些内核的时间与并发内核的时间几乎相同。我们有没有办法知道内核是否并发执行?如果并发内核不工作,原因可能是什么?内核1.2如何“导致”设备到设备的内存拷贝?要做到这一点,您需要使用主机API调用,如cudaMemcpyThanks,以获得快速响应。这就是我困惑的地方。在我的内核1.2中,我有一些指令将一些数据从某个内存位置复制到另一个内存位置。这就是我所说的“内核1.2导致设备到设备的内存拷贝”。我猜你会说流0中的内核和流1中的内核可以并发运行,对吗?大概你们所有的内核都读写全局内存,否则你会运行什么?这不是设备到设备的内存拷贝。我明白了。根据我的测量,顺序运行这些内核的时间与并发内核的时间几乎相同。我们有没有办法知道内核是否并发执行?如果并发内核不工作,原因可能是什么。