На хосте у меня есть зубчатый массив, реализованный с вектором вектора целых.
Чтобы настроить зубчатый массив на устройстве, я начал с выделения указателя на указатель целых:
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
сообщает об ошибке.
Почему это помечено как недопустимый аргумент? Или, если это какой-то другой аргумент, какой?