J'ai eu le même problème et a réussi à le résoudre.
La réponse de FabrizioM a été un bon point de départ pour moi et m'a beaucoup aidé. Mais néanmoins j'ai rencontré quelques problèmes quand j'ai essayé de transférer le code à mon projet. En utilisant les commentaires et les messages supplémentaires j'ai pu écrire un exemple de travail (VS2012, CUDA7.5). Ainsi, je vais poster mon code comme réponse supplémentaire et comme point de départ pour les autres.
Pour comprendre la dénomination: J'utilise un vecteur d'OpenCV cv :: Mat en entrée qui est capturé à partir de plusieurs caméras et je suis en train de traiter ces images dans le noyau.
void TransferCameraImageToCuda(const std::vector<cv::Mat*>* Images)
{
int NumberCams = Images->size();
int imageSize = Images->at(0)->cols*Images->at(0)->rows;
CUdeviceptr* CamArraysAdressOnDevice_H;
CUdeviceptr* CamArraysAdressOnDevice_D;
//allocate memory on host to store the device-address of each array
CamArraysAdressOnDevice_H = new CUdeviceptr[NumberCams];
// allocate memory on the device and store the arrays on the device
for (int i = 0; i < NumberCams; i++){
cudaMalloc((void**)&(CamArraysAdressOnDevice_H[i]), imageSize * sizeof(unsigned short));
cudaMemcpy((void*)CamArraysAdressOnDevice_H[i], Images->at(i)->data, imageSize * sizeof(unsigned short), cudaMemcpyHostToDevice);
}
// allocate memory on the device to store the device-adresses of the arrays
cudaMalloc((void**)&CamArraysAdressOnDevice_D, sizeof(CUdeviceptr*)* NumberCams);
// Copy the adress of each device array to the device
cudaMemcpy(CamArraysAdressOnDevice_D, CamArraysAdressOnDevice_H, sizeof(CUdeviceptr*)* NumberCams, cudaMemcpyHostToDevice);
}
Dans le lancement du noyau que je suis coulée le pointeur de l'appareil au pointeur de type de données (unsigned short **)
DummyKernel<<<gridDim,blockDim>>>(NumberCams, (unsigned short**) CamArraysAdressOnDevice_D)
et la définition du noyau est par exemple:
__global__ void DummyKernel(int NumberImages, unsigned short** CamImages)
{
int someIndex = 3458;
printf("Value Image 0 : %d \n", CamImages[0][someIndex]);
printf("Value Image 1 : %d \n", CamImages[1][someIndex]);
printf("Value Image 2 : %d \n", CamImages[2][someIndex]);
}
Le point principal de cela est que tous ces tableaux ont des tailles différentes. –