【发布时间】:2018-12-22 12:45:49
【问题描述】:
从CUDA manual,我知道cudaStreamQuery 在异步流上运行:
查询异步流的完成状态。
我编写了一个简单的程序来测试它在“默认流”上的行为:
#include <cstdlib>
#include <iostream>
#define cudaSafeCall(call) \
do {\
cudaError_t err = call;\
if (cudaSuccess != err) \
{\
std::cerr << "CUDA error in " << __FILE__ << "(" << __LINE__ << "): " \
<< cudaGetErrorString(err) << '\n';\
exit(EXIT_FAILURE);\
}\
} while(0)
int main(void)
{
int N = 1<<20;
float *x, *d_x;
x = (float*)malloc(N*sizeof(float));
cudaSafeCall(cudaMalloc(&d_x, N*sizeof(float)));
cudaSafeCall(cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyDefault));
cudaSafeCall(cudaStreamQuery(0));
cudaSafeCall(cudaFree(d_x));
free(x);
return 0;
}
构建并运行它:
$ nvcc sync_test.cu -o sync_test
$ ./sync_test
CUDA error in sync_test.cu(25): device not ready
在cudaMemcpy和cudaStreamQuery之间加上cudaStreamSynchronize(0);后,错误消失了:
cudaSafeCall(cudaMemcpy(d_x, x, N*sizeof(float), cudaMemcpyDefault));
cudaSafeCall(cudaStreamSynchronize(0));
cudaSafeCall(cudaStreamQuery(0));
我有点困惑:
a) cudaMemcpy() 是与主机码同步的,所以cudaMemcpy 返回后,该流中的复制工作应该完成,为什么cudaStreamQuery(0) 在第一种情况下返回错误?
b) 如果cudaStreamQuery 仅适用于异步流,而不适用于默认流,为什么cudaStreamQuery 在第二种情况下不返回错误?
【问题讨论】:
标签: cuda