C++ 复制到锯齿数组的元素时发生CUDA运行时错误

C++ 复制到锯齿数组的元素时发生CUDA运行时错误,c++,cuda,jagged-arrays,C++,Cuda,Jagged Arrays,在主机上,我使用int向量实现了一个交错数组 要在设备上设置锯齿状数组,我首先分配一个指向int指针的指针: int ** adjlist; // host pointer int ** d_adjlist; // device pointer 为了澄清一些术语,我将指针数组adjlist称为“基”,将指向adjlist[I]的数组称为“齿” 当我要将齿从矢量向量复制到设备上的齿时,出现了问题,代码如下: // this holds the tooth to be copied

在主机上,我使用int向量实现了一个交错数组

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

int **   adjlist;    // host pointer
int ** d_adjlist;    // device pointer
为了澄清一些术语,我将指针数组
adjlist
称为“基”,将指向
adjlist[I]
的数组称为“齿”

当我要将齿从矢量向量复制到设备上的齿时,出现了问题,代码如下:

// 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 ) );

    }
}
至少在这一行,
cudaSafeCall
函数表示发生错误


为什么这会被标记为无效参数?或者如果是其他参数,哪一个?

复制锯齿阵列的一般方法是正确的,但我认为您对错误的解释是错误的。如果您从
cudaMemcpy
中得到一个无效的参数错误,它几乎总是指针参数之一。你能发布一个其他人可以编译和运行的简明复制案例吗。就像你上一个CUDA问题一样,通常是你没有展示的东西导致了问题。好的,我将把代码发布到这个存储库:,我现在在家,上班时会完成。我遇到了一些ssh问题,但是与此同时,你可以使用这个公共代码来查看代码并自己编译。你真的希望有人费力地通过2000行代码来发现你的问题吗?我想你们可能会觉得这个链接很有启发性……我已经投票结束了这个8年的问题。github提供的MCVE现在是404,并且没有编译。没有(过去也没有)办法回答这个问题
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 ) );

    }
}
                                   cudaMemcpyHostToDevice ) );