2016-05-10 6 views
1

I die folgende OpenCL Code Definieren einer Kernfunktion haben:Hinzufügen Mutex auf OpenCL Kernel

kernel void test_print(global char* src) 
{ 
    printf("%c\t", src[0]); 
    src[0]++; 
    printf("%c\n", src[0]); 
} 

die src ist ein Array mit einem Element {'0'};

Der Ausgang ist

0 0 0 0 1 
1 
1 
1 

I Das liegt daran, dass für jeden Thread kein Mutex vorhanden ist. Aber wie fügt man Mutex in OpenCL hinzu? Kann jemand ein einfaches Beispiel geben?

+0

Es gibt keine Möglichkeit, Mutex in OpenCL hinzuzufügen. In SIMD müssen alle Threads jeden Befehl gleichzeitig verarbeiten. Blockiert einen Thread, blockiert die gesamte Gruppe von Threads. Es gibt Workarounds, die globalen/lokalen Speicher und Atomics verwenden, aber schrecklich langsam sind, also ziehe ich es vor, die Leute nicht zu ermutigen, sie zu benutzen. – DarkZeros

Antwort

1
__kernel void test_print(__global char* src, __global int* increment) 
{ 
    printf("%c\t", src[0]); 
    if(atomic_add(increment, 1)==get_global_id(0)) 
    { 
     src[0]++; 
    } 
    printf("%c\n", src[0]); 
} 

Dies sollte mit einem 1D Problem funktionieren, aber in Wirklichkeit ist es schrecklich langsam. Es könnte verbessert werden, indem Barrieren innerhalb von Blöcken verwendet werden, anstatt eine atomare Operation für jeden Thread zu verwenden. Nichtsdestotrotz würde ich Ihnen empfehlen, die Möglichkeit zu überdenken, Ihre Arbeit in mehrere Kernel aufzuteilen und diese atomaren Operationen zu vermeiden.

Verwandte Themen