我读到可以使用内核启动来同步不同的块,即,如果我希望所有块在继续操作2之前完成操作1,我应该将操作1放在一个内核中,将操作2放在另一个内核中。 这样,我就可以实现块之间的全局同步。 但是,cuda c编程指南提到内核调用是异步的,即。 CPU不会等待第一个内核调用完成,因此,CPU也可以在第一个内核完成之前调用第二个内核。 但是,如果这是真的,那么我们就不能使用内核启动来同步块。 请让我知道我哪里出错了

===============>>#1 票数:34 已采纳

从CPU的角度来看,内核调用是异步的,所以如果你连续调用2个内核,第二个内核将被调用,而不必等待第一个内核完成。 它只表示控件立即返回CPU。

在GPU方面,如果你没有指定不同的流来执行内核,它们将按照它们被调用的顺序执行(如果你没有指定流,它们都会转到默认流并且是串行执行的)。 只有在第一个内核完成后,第二个内核才会执行。

此行为对于具有支持并发内核执行的计算能力2.x的设备有效。 在其他设备上,即使内核调用仍然是异步的,内核执行也始终是顺序的。

检查每个CUDA程序员应阅读的3.2.5节中的CUDA C编程指南。

===============>>#2 票数:8

接受的答案并不总是正确的。

在大多数情况下,内核启动是异步的。 但在下面的例子中,它是同步的 人们很容易忽视它们。

  • 环境变量CUDA_LAUNCH_BLOCKING等于1。
  • 使用分析器( nvprof ),而不启用并发内核分析
  • memcpy涉及非页面锁定的主机内存。

程序员可以通过将CUDA_LAUNCH_BLOCKING环境变量设置为1来全局禁用系统上运行的所有CUDA应用程序的内核启动的异步性。此功能仅用于调试目的,不应用作使生产软件可靠运行的方法。

如果通过分析器(Nsight,Visual Profiler)收集硬件计数器,则内核启动是同步的,除非启用了并发内核分析。 如果异步内存副本涉及非页锁定的主机内存,则它们也将是同步的。

来自NVIDIA CUDA编程指南( http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#concurrent-execution-host-device )。

===============>>#3 票数:-1

从2.0 CUDA功能版本开始支持并发内核执行。

此外,可以比所有warp内核更早地返回CPU代码。

在这种情况下,您可以自己提供同步。

  ask by Programmer translate from so

未解决问题?本站智能推荐:

1回复

并非所有模块都调用CUDA内核

尝试运行简单的向量加法时,我遇到了奇怪的行为。 如果我使用printf函数运行以下代码,则一切运行正常,我得到了预期的结果5050。 现在,如果删除了printf函数,则仅执行第一个块,并且得到2080,这是总计64之和的预期结果。 有人知道这里发生了什么吗? 在此先感谢您的
1回复

从内核返回垃圾调用CUDA printf float?

我正在尝试使用对printf调用从内核打印浮点值。 我这样做是为了检查正在使用的另一个程序,该程序需要将浮点数组从主机复制到设备。 我编写了一个内核来检查存储在设备中的float数组中的值,但仅得到0作为回报。 所以我写了这段代码来检查: 与输出: 如果我在打印数组的值
3回复

如何推出CUDA内核?

我创建了一个简单的CUDA应用程序来添加两个矩阵。 它编译得很好。 我想知道所有线程如何启动内核以及CUDA中的流程是什么? 我的意思是,每个线程以什么方式执行矩阵的每个元素。 我知道这是一个非常基本的概念,但我不知道这一点。 关于流量我很困惑。
1回复

优化CUDA内核

如何进一步优化以下CUDA内核? 还是已经针对其目的进行了优化? 我在想,也许我可以在主机代码中使用__constant__内存,以便使用随机数设置数组。 这可能吗? 我知道它是只读内存,所以我困惑的是我是否可以使用常量内存而不是__global__内存。
1回复

cuda-内核优化

我创建了一个简单的粒子系统。 我有一台具有计算能力2.1的设备。 我可以更改些什么来优化内核? 我假设变量tPos和tVel存储在寄存器中。
1回复

CUDA内核功能代码是一次上传还是每次调用都上传到GPU-RAM?

启动程序时,CUDA内核功能的可执行代码是立即上传到GPU还是每次调用内核功能时都上传代码? 或在哪种情况下可能是另一种方式? 这会极大地影响编程方法的选择: CPU主机对内核函数的大量调用 动态并行性的使用以及GPU设备对内核函数的大量调用
1回复

CUDA Nsight - 找出CPU在内核/运行时api调用之间正在做什么

我想知道是否有任何方法可以在Nsight中发现在两个运行时API /驱动程序或内核调用(图像价值千言万语)之间调用的CPU函数: 可能吗?
1回复

如何在CUDA中为多个Thrust对象成员函数调用内核函数?

请注意,我是CUDA的绝对初学者,以下所有内容都是未经测试的伪代码。 我来自JavaScript,我的C ++也非常生疏,所以我为我的无知道歉:) 我试图使用CUDA来回溯许多不同的外汇策略。 使用Thrust,我从类(伪代码)实例化了1000个对象: 现在假设我想在dat
1回复

内核更新中断CUDA

我已将NVIDIA Grid K2 GPU分配给运行Ubuntu 14.04的虚拟服务器。 要在自动内核更新后重新安装正确的驱动程序,我先运行了sudo apt-get update然后运行了sudo apt-get install nvidia-current 。 现在,我无法再使CU
1回复

并发内核和CUDA流的行为

我想知道,如果我在一个流中运行一个包含10个1000个线程的块的内核来分析数据数组,然后启动一个需要10个1000个线程的10个块来分析第二个流的另一个数组的内核,那该怎么办?发生? 卡上的非活动线程是否将开始分析第二个阵列的过程? 还是第二个流将被暂停直到第一个流必须完成? 谢谢