- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
什么时候真正需要调用cudaDeviceSynchronize
函数?
据我从 CUDA 文档中了解到,CUDA 内核是异步的,因此我们似乎应该在每次内核启动后调用 cudaDeviceSynchronize
。但是,我尝试过使用和不使用任何 cudaDeviceSynchronize
的相同代码(训练神经网络),除了时间测量之前的代码。我发现我得到了相同的结果,但速度提高了 7-12 倍(取决于矩阵大小)。
因此,问题是除了时间测量之外是否还有其他原因使用 cudaDeviceSynchronize
。
例如:
使用cudaMemcpy
将数据从GPU复制回主机之前是否需要?
如果我进行矩阵乘法,例如
C = A * B
D = C * F
我应该在两者之间放置cudaDeviceSynchronize
吗?
从我的实验看来,我没有。
为什么cudaDeviceSynchronize
使程序速度如此之慢?
最佳答案
虽然 CUDA 内核启动是异步的,但放置在一个流中的所有与 GPU 相关的任务(这是默认行为)都是按顺序执行的。
例如,
kernel1<<<X,Y>>>(...); // kernel start execution, CPU continues to next statement
kernel2<<<X,Y>>>(...); // kernel is placed in queue and will start after kernel1 finishes, CPU continues to next statement
cudaMemcpy(...); // CPU blocks until memory is copied, memory copy starts only after kernel2 finishes
因此,在您的示例中,不需要 cudaDeviceSynchronize
。但是,对于调试来检测哪个内核导致了错误(如果有的话)可能很有用。
cudaDeviceSynchronize
可能会导致一些速度减慢,但 7-12x 似乎太多了。可能是时间测量存在一些问题,或者内核可能非常快,并且显式同步的开销相对于实际计算时间来说是巨大的。
关于cuda - 何时调用 cudaDeviceSynchronize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11888772/
我遇到了一个非常奇怪的错误,在运行特定大小的 Heat 2D 模拟时出现“非法内存访问”错误,但如果我运行完全相同的模拟,模拟运行良好,只是元素更少。 是否有增加数组大小会导致此异常的原因?我使用的是
我是 CUDA 的新手,对 cudaEvent 有点困惑。我现在有一个代码示例,如下所示: float elapsedTime; cudaEvent_t start, stop; CUDA_ERR_C
我有以下两个几乎相同的示例代码。 code1.cu 使用 cudaMalloc 和 cudaMemcpy 处理设备/主机变量值交换。 code2.cu使用cudaMallocManaged,因此不需要
什么时候真正需要调用cudaDeviceSynchronize函数? 据我从 CUDA 文档中了解到,CUDA 内核是异步的,因此我们似乎应该在每次内核启动后调用 cudaDeviceSynchron
我正在具有统一内存的 TegraK1 板上实现共轭梯度求解器。我面临的问题是在循环中我必须执行 cudaDeviceSynchronize();两次更新变量,与 TI Keystone-II 相比,这
我最近发现了 cuda-memcheck 的 racecheck 工具,可用于 CUDA 5.0(cuda-memcheck --tool racecheck,请参阅 NVIDIA doc)。该工具可
我在使用并发 CUDA 时遇到了一些问题。看看附图。内核在标记点启动,即 0.395 秒。然后是一些绿色的 CpuWork。最后,调用 cudaDeviceSynchronize。在 CpuWork
我在使用并发 CUDA 时遇到了一些问题。看看附图。内核在标记点启动,即 0.395 秒。然后是一些绿色的 CpuWork。最后,调用 cudaDeviceSynchronize。在 CpuWork
CUDA 版本 10.1。帕斯卡GPU。所有命令都发布到默认流: void * ptr; cudaMalloc(&ptr, ...); launch_kernel>>(ptr); cudaDevice
我用 CUDA 6.5 和 4 x GPU Kepler . 我使用多线程、CUDA 运行时 API 并从不同的 CPU 线程访问 CUDA 上下文(通过使用 OpenMP - 但它并不重要)。 当我
这三个函数有什么区别,尤其是最后两个?图书馆手册说 Note that this function is deprecated because its name does not reflect it
非常感谢您阅读我的帖子。 我正在做 CUDA 工作,但一直收到 cudaDeviceSynchronize() 错误代码 77:cudaErrorIllegalAddress,不知道为什么。我搜索了代
__global__ void helloCUDA(float f) { printf("Hello thread %d, f=%f\n", threadIdx.x, f); } int ma
我是一名优秀的程序员,十分优秀!