2017-03-16 1 views
2

J'ai plusieurs variables de types différents stockées dans un tableau char. Normalement, je les écrire au tableau de cette façon:Copie d'octets sans memcpy

int a = 5; 
memcpy(offset, (char*)&a, sizeof(int)) 

Cependant, memcpy ne fonctionne pas dans les noyaux OpenCL. Quelle serait la meilleure façon de faire la même chose sans cette fonction?

Répondre

2

Vous pouvez fournir assez facilement mymemcpy

void mymemcpy(unsigned char *dest, const unsigned char *src, size_t N) 
    { 
    size_t i; 

    for(i=0;i<N;i++) 
     dest[i] = src[i]; 
    } 

Cependant, il est pas très efficace, car la plupart des copies sont alignées des copies des multiples de 4 ou 8 octets. Si vous pouvez déterminer que l'alignement est de 8 octets, copiez-le en unités de long non signées. Parfois, il vaut même la peine de remplir un tampon pour l'amener à un multiple de 8 octets.

3

Que diriez-vous d'une boucle?

int a; 
unsigned char * p = (unsigned char *)&a; 
for (int i = 0; i != sizeof(int); ++i) offset[i] = p[i]; 
1

Vous pouvez utiliser les commandes vload et vstore pour seulement 1 à 16 octets pour le type de caractères et 4 à 64 octets pour le type int et 8 à 128 octets pour le type long. Cela pourrait être avantageux ou désavantageux en fonction des motifs d'accès à la mémoire totale des cœurs.

Je n'ai pas vérifié mais cela devrait déclencher un compilateur pour utiliser la charge rapide de sse avx et stocker sur un processeur et utiliser la largeur de bus complète pour gpu. Les conditions d'alignement sont également remplies car il s'agit d'un comportement uhdesinde pour l'accès non aligné avec le magasin de chargement.

Vous devez d'abord copier la partie tête non alignée du groupe. S'il y en a.