Ошибка выполнения CUDA при копировании в элемент зубчатого массива - PullRequest
1 голос
/ 22 сентября 2011

На хосте у меня есть зубчатый массив, реализованный с вектором вектора целых.

Чтобы настроить зубчатый массив на устройстве, я начал с выделения указателя на указатель целых:

int **   adjlist;    // host pointer
int ** d_adjlist;    // device pointer

Просто для пояснения некоторой терминологии я называю массив указателей adjlist «основанием», а массивы, которые указывают на adjlist[i] «зубцами».

// this is the width of the base
const int ens_size = 12;    

// allocate the base on the device
cutilSafeCall( cudaMalloc( (void***)&d_adjlist, ens_size*sizeof(int*) ) );

// to store the contents of base on host (I can't cudaMalloc the teeth directly, as that would require dereferencing a pointer to device memory)
adjlist = static_cast<int**>( malloc( ens_size*sizeof(int*) ) );

// copy the contents of base from the device to the host
cutilSafeCall( cudaMemcpy( adjlist, d_adjlist, ens_size*sizeof(int*), cudaMemcpyDeviceToHost) ); 

Все это отлично работает, теперь база готова. Исходный вектор векторов, который я упоминал в начале, хранится в nets[i]->adjlist. Теперь я выделяю зубы следующим циклом:

int N = 6;
int numNets = 2;

for(int i=0; i < numNets; ++i)
{
    for(int j=0; j < N; ++j)
    {
        k = nets[i]->adjlist[j].size();

        // allocate the "teeth" of the adjacency list
        cutilSafeCall( cudaMalloc( (void**)&(adjlist[N*i+j]), k ) );
    }
 }

Моя проблема возникает, когда я иду копировать зубы из вектора векторов в зубы на устройстве, вот код:

// this holds the tooth to be copied to the device
int h_adjlist[Kmax];    // k <= Kmax

for(int i=0; i < numNets; ++i)
{
    for(int j=0; j < N; ++j)
    {
        k = nets[i]->adjlist[j].size();

        // copy the adjacency list of the (Ni+j)-th node
        copy( nets[i]->adjlist[j].begin(), nets[i]->adjlist[j].end(), h_adjlist );

        cutilSafeCall( cudaMemcpy( adjlist[N*i+j], 
                                   h_adjlist, 
                                   sizeof(int)*k,  
                                   cudaMemcpyHostToDevice ) );

    }
}

Когда я пытаюсь запустить код, я получаю Runtime API error: invalid argument. ошибку в строке:

                                   cudaMemcpyHostToDevice ) );

По крайней мере, это строка, в которой функция cudaSafeCall сообщает об ошибке.

Почему это помечено как недопустимый аргумент? Или, если это какой-то другой аргумент, какой?

1 Ответ

0 голосов
/ 22 сентября 2011

Согласно вашему коду, adjlist является указателем на память хоста, а h_adjlist также является памятью хоста.Или я что-то пропустил?

Разве это не должно быть

cutilSafeCall( cudaMemcpy( d_adjlist[N*i+j], 
                               h_adjlist, 
                               sizeof(int)*k,  
                               cudaMemcpyHostToDevice ) );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...