Не заботит ли cudaFreeHost, какое устройство активно, когда cudaMallocHost используется для выделения памяти? - PullRequest
8 голосов
/ 21 декабря 2011

Я использую 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);

У меня сложилось впечатление, что вам нужно вызывать cudaSetDevice только в том случае, если вы хотите выделить память для определенного графического процессора.В приведенном выше примере я только распределяю закрепленную память на ЦП.

Это ошибка или я что-то упустил в руководстве?

1 Ответ

8 голосов
/ 21 декабря 2011

Я нашел проблему.cudaHostAlloc и cudaMallocHost НЕ ТО ЖЕ .

Для всех, кто сталкивается с этой проблемой, решение состоит в использовании

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

вместо

cudaMallocHost(&test, 1024*sizeof(int));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...