复制到锯齿状数组元素时出现CUDA运行时错误

时间:2011-09-21 23:23:03

标签: c++ cuda jagged-arrays

在主机上,我有一个用ints矢量向量实现的锯齿状数组。

要在设备上设置锯齿状数组,我首先分配一个指向int的指针:

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 :(得分:-1)

根据您的代码,adjlist是指向主机内存的指针,h_adjlist也是主机内存。或者我错过了什么?

不应该是

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