2010-12-06 38 views
0

Chers Cuda chercheurs,
Vous recherchez une solution pour le problème ci-dessousConversion Cuda Array1 de Typename1 à LeTableau2 de Typename2

a) j'ai deux tableaux 1) array1 de taille1 qui est de typename1 2) array2 de taille1 qui est de typename2

b) Je suis désireux d'écrire un noyau du prototype suivant

__global__ kernel(void* dest, void* src, int dest_sizeoftype, int src_sizeoftype, int num_array_elts);

c) Supposons que je crée des threads cuda num_array_elts, chaque thread copiant son elt de src à destination.

Problème: a) L'endroit où je suis bloqué est la fonction à utiliser pour copier num_bytes de src vers dest dans le noyau.

vous remerciant à l'avance Cordialement, Nagaraju

Répondre

2

L'algorithme copy dans Thrust facilite la tâche.

#include <thrust/copy.h> 
#include <thrust/device_ptr.h> 

int * src = ... 
float * dst = ... 

// first wrap the 'raw' pointers 
thrust::device_ptr<int> wrapped_src(src); 
thrust::device_ptr<float> wrapped_dst(dst); 

// then pass wrapped pointers to copy() 
thrust::copy(wrapped_src, wrapped_src + num_array_elts, wrapped_dst); 

Reportez-vous au guide QuickStart pour plus d'informations sur Thrust.

+0

Parfois cuda ne supporte pas le double, puis-je l'utiliser aussi pour le double? Si src est double et dst est court, c'est le scénario ... Merci. – Naga

+0

Le code ci-dessus fonctionnera pour les doubles si le périphérique CUDA les prend en charge. En principe, vous pouvez convertir des doubles en shorts sur des appareils antérieurs (Compute Capability 1.0 et 1.1), mais cela serait difficile et fastidieux. – wnbell

0

Si vous connaissez les types des 2 baies, ce problème devient assez trivial.

__global__ kernel(float* dest, int* src){ 

    int idx=blockIdx.x*blockDim.x+threadIdx.x; 
    dest[ idx ] = src[ idx ]; 

} 

Si votre tableau de destination utilisait un mot plus grand, par ex. un double, cela fonctionnerait encore et il n'y aurait pas besoin de connaître le nombre d'octets. Assurez-vous juste d'allouer le bon nombre d'octets lorsque vous utilisez cudamalloc.