我正在使用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上分配固定内存.
这是一个错误还是我错过了手册中的内容?
我发现了这个问题.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)