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

twe*_*ter 8 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);    
} 
Run Code Online (Sandbox Code Playgroud)

调用cudaFreeHost时抛出以下错误:

First-chance exception at 0x000007fefd96aa7d in Test.exe: Microsoft C++ exception: cudaError_enum at memory location 0x0022f958..
Run Code Online (Sandbox Code Playgroud)

错误的价值是 cudaErrorInvalidValue

此变体发生相同的错误:

err = cudaSetDevice(   0   ); err = cudaMallocHost(&test, 1024*sizeof(int));    
err = cudaSetDevice(   1   ); err = cudaFreeHost(test);
Run Code Online (Sandbox Code Playgroud)

以下变体不会引发错误:

err = cudaSetDevice(   0   ); err = cudaMallocHost(&test, 1024*sizeof(int));    
err = cudaSetDevice(   0   ); err = cudaFreeHost(test);
Run Code Online (Sandbox Code Playgroud)

err = cudaSetDevice(   1   ); err = cudaMallocHost(&test, 1024*sizeof(int));    
err = cudaSetDevice(   1   ); err = cudaFreeHost(test);
Run Code Online (Sandbox Code Playgroud)

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

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

twe*_*ter 8

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

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

cudaHostAlloc(&test, 1024*sizeof(int),cudaHostAllocPortable);
Run Code Online (Sandbox Code Playgroud)

代替

cudaMallocHost(&test, 1024*sizeof(int));
Run Code Online (Sandbox Code Playgroud)

  • 除非UVA对系统有效[UVA透明地启动CUDA 4.0,在64位Linux上.它也可以在Windows上以有限的方式使用,如果您使用的是TCC驱动程序],cudaMallocHost()仅映射当前设备的主机内存,并且只有该设备可以释放内存.使主机内存分配"可移植"映射所有设备的内存,任何设备都可以释放它.这就是您的解决方案有效的原因 (6认同)