当cudaMallocHost用于分配内存时,cudaFreeHost是否关心哪些设备处于活动状态?

时间:2011-12-21 14:41:27

标签: cuda

我正在使用Cuda SDK 4.0,遇到了一个问题,我花了2天的时间来讨论以下代码。

#include <cuda.h>
#include <cuda_runtime.h>
void main (int argc, char ** argv) {

    int* test;
    cudaError_t err;

    err = cudaSetDevice(   1   ); err = cudaMallocHost(&test, 1024*sizeof(int));    
    err = cudaSetDevice(   0   ); err = cudaFreeHost(test);    
} 

调用cudaFreeHost时会抛出以下错误:

First-chance exception at 0x000007fefd96aa7d in Test.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0022f958..

错误值为cudaErrorInvalidValue

此变体发生同样的错误:

err = cudaSetDevice(   0   ); err = cudaMallocHost(&test, 1024*sizeof(int));    
err = cudaSetDevice(   1   ); err = cudaFreeHost(test);

以下变体不会引发错误:

err = cudaSetDevice(   0   ); err = cudaMallocHost(&test, 1024*sizeof(int));    
err = cudaSetDevice(   0   ); err = cudaFreeHost(test);

err = cudaSetDevice(   1   ); err = cudaMallocHost(&test, 1024*sizeof(int));    
err = cudaSetDevice(   1   ); err = cudaFreeHost(test);

如果你想在特定的GPU上分配内存,我只需要调用cudaSetDevice。在上面的例子中,我只在CPU上分配固定内存。

这是一个错误还是我错过了手册中的内容?

1 个答案:

答案 0 :(得分:8)

我发现了问题。 cudaHostAlloc和cudaMallocHost 不是同一个

对于遇到此问题的任何人,解决方案是使用

cudaHostAlloc(&test, 1024*sizeof(int),cudaHostAllocPortable);

而不是

cudaMallocHost(&test, 1024*sizeof(int));