cudastream的问题重新编辑了

http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6793

您的帖子内容代为搬运如下:

for (int i = 0; i < 2; ++i){
cudaMemcpyAsync(inputDevPtr + i * size, hostPtr + i * size,
size, cudaMemcpyHostToDevice, stream);
MyKernel<<<100, 512, 0, stream>>> (outputDevPtr + i * size, inputDevPtr + i * size, size);
cudaMemcpyAsync(hostPtr + i * size, outputDevPtr + i * size, size, cudaMemcpyDeviceToHost, stream);
}

有资料上看到 cuda stream 是一系列并发执行的命令,相对无序列,这种行为没有保证,无正确性保证.
那么cuda stream在函数中主要的作用是什么呢?

----------------------------回答的分割线-------------------------------------------
1:关于stream的解释请参阅NV官方手册为准。
2:stream内部命令是顺序串行的,而stream之间是不保证顺序的,因此如果要利用stream,那么必须在使用时保证不同stream之间相对顺序不影响算法正确性才可以。
3:因为2:,所以您给出的“这种行为没有保证,无正确性保证”的评价是无意义的,因为正确性不因为stream间相对运行顺序影响,这是使用stream的基本要求。
4:stream常用在计算和传输互相掩盖,kernel并行执行等用途。

大致如上,祝您好运~

计算和传输互相掩盖能不能再详细解释下,是不是异步

LZ您好:

1:你的关于计算和传输互相掩盖的问题,可以参阅如下blog内容:
https://developer.nvidia.com/content/how-overlap-data-transfers-cuda-cc
以及论坛的这篇帖子:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6776&extra=page%3D1&page=3

2:您关于“异步”的疑问,请移步如下帖子:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6771&extra=page%3D1

大致如此,供您参考。

祝您编码顺利~