我正在使用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上分配固定内存。
这是一个错误还是我错过了手册中的内容?
答案 0 :(得分:8)
我发现了问题。 cudaHostAlloc和cudaMallocHost 不是同一个 。
对于遇到此问题的任何人,解决方案是使用
cudaHostAlloc(&test, 1024*sizeof(int),cudaHostAllocPortable);
而不是
cudaMallocHost(&test, 1024*sizeof(int));