2017-03-16 4 views
2

Ich habe mehrere Variablen verschiedener Typen in einem Char-Array gespeichert. Normalerweise würde ich sie auf das Array schreiben auf diese Weise:Kopieren von Bytes ohne memcpy

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

Allerdings ist Memcpy nicht in OpenCL-Kernel zu arbeiten. Was wäre der einfachste Weg, das Gleiche ohne diese Funktion zu tun?

Antwort

2

Schnell genug 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]; 
    } 

bieten kann jedoch nicht sehr effizient ist, weil die meisten Kopien Kopien von Vielfachen von 4 oder 8 Byte ausgerichtet sind. Wenn Sie herausfinden können, dass die Ausrichtung 8 Byte beträgt, kopieren Sie in Einheiten von unsigned long long. Manchmal lohnt es sich sogar, einen Puffer aufzufüllen, um ihn auf ein Vielfaches von 8 Bytes zu bringen.

3

Wie wäre es mit einer Schleife?

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

Sie können vload- und vstore-Befehle nur für 1-16 Byte für char-Typ und 4-64 Byte für int-Typ und 8-128 Byte für langen Typ verwenden. Dies könnte in Abhängigkeit von den Speicherzugriffsmustern der gesamten Kerne vorteilhaft oder nachteilig sein.

Ich habe nicht überprüft, aber dies sollte einen Compiler auslösen, um schnell sse AVX laden und speichern auf einer CPU und verwenden Sie die volle Busbreite für GPU. Auch die Ausrichtungsbedingungen sind erfüllt, da es ein uhdesinde Verhalten für den nicht ausgerichteten Zugriff mit Ladespeicher ist.

Sie müssen zuerst den nicht ausgerichteten Kopfteil des Arrays kopieren. Wenn da etwas ist .

Verwandte Themen