2016-10-24 2 views
3

je rencontrais une erreur de compilation où la copie d'un vecteur bool à la mémoire cuda échoueraErreur lors de la copie vecteur bool à la mémoire CUDA

bool *gpu; 

cudaMalloc(reinterpret_cast<void **>(&gpu), 100); 

std::vector<bool> cpu(100); 

for(int i=0;i<100;i++){ 
    cpu[i]=true; 
} 

cudaMemcpy(gpu, cpu.data(), 100*sizeof(bool), cudaMemcpyHostToDevice); 

Il retourne

error: invalid use of void expression cudaMemcpyHostToDevice); 

mais le même code avec un vecteur de flotteur compilera.

float *gpu; 

cudaMalloc(reinterpret_cast<void **>(&gpu), 100); 

std::vector<float> cpu(100); 

for(int i=0;i<100;i++){ 
    cpu[i]=i; 
} 

cudaMemcpy(gpu, cpu.data(), 100*sizeof(float), cudaMemcpyHostToDevice); 

Pourquoi cela se produit-il?

+3

['vector '] (http://fr.cppreference.com/w/cpp/container/vector_bool) est spécial, et pas dans le bon sens. –

Répondre

5

vector<bool> est une erreur de C++ 98 dont nous ne pouvons pas nous débarrasser (au moins en termes d'occupation du nom). La norme recommande de conserver au stockage une représentation optimisée en espace des bits et c'est ce que font la plupart des implémentations.

Vous pouvez contourner ce problème en utilisant vector<uint8_t> à la place.

+1

Après un test rapide, il semble fonctionner correctement. Aussi, il devrait être uint8_t au lieu de uin8_t. – user3667089