0

网络上的大多数教程、指南、书籍和问答似乎都指的是 CUDA 3 和 4.x,所以这就是我专门询问 CUDA 5.0 的原因。对于这个问题...

我想为一个有两个 CUDA 设备的环境编程,但只使用一个线程,以使设计简单(特别是因为它是一个原型)。我想知道以下代码是否有效:

float *x[2];
float *dev_x[2];

for(int d = 0; d < 2; d++) {
    cudaSetDevice(d);
    cudaMalloc(&dev_x[d], 1024);
}

for(int repeats = 0; repeats < 100; repeats++) {
    for(int d = 0; d < 2; d++) {
        cudaSetDevice(d);
        cudaMemcpy(dev_x[d],x[d],1024,cudaMemcpyHostToDevice);

        some_kernel<<<...>>>(dev_x[d]);

        cudaMemcpy(x[d],dev_x[d],1024,cudaMemcpyDeviceToHost);
    }
    cudaStreamSynchronize(0);
}

我想特别知道cudaMalloc(...)在测试之前的 s 是否持久,即使交换cudaSetDevice()发生在同一个线程中。另外,我想知道与上下文相关的对象是否也会发生同样的情况,例如cudaEvent_tcudaStream_t

我问它是因为我有一个这种风格的应用程序,它不断出现一些映射错误,如果缺少内存泄漏或错误的 API 使用,我找不到它是什么。

注意:在我的原始代码中,我会检查每个 CUDA 调用。我没有把它放在这里是为了代码的可读性。

4

1 回答 1

1

这只是一个错字吗?

for(int d = 0; d < 2; d++) {
    cudaSetDevice(0);  // shouldn't that be 'd'
    cudaMalloc(&dev_x, 1024);
}

请检查所有 API 调用的返回值!

于 2013-02-12T17:53:41.987 回答