2016-05-10 4 views
1

にミューテックスを追加:Iは、カーネル関数を定義する次のOpenCLコードを有するOpenCLのカーネル

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

src出力が

0 0 0 0 1 
1 
1 
1 

Iである{'0'};

つの要素を持つ配列でありますこれは、スレッドごとにミューテックスが存在しないために発生していると考えられます。しかし、どのようにOpenCLでmutexを追加するのですか?誰かが簡単な例を挙げることができますか?

+0

OpenCLにミューテックスを追加する方法はありません。 SIMDでは、すべてのスレッドが各命令を同時に処理する必要があります。 1つのスレッドをブロックすると、スレッドのグループ全体がブロックされます。グローバル/ローカルメモリ+アトミックを使用する回避策がありますが、恐ろしく遅いので、人々にそれらを使用することを推奨したくありません。 – DarkZeros

答えて

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]); 
} 

これは1Dの問題では機能するはずですが、実際は非常に遅いです。スレッドごとにアトミックな操作を使用する代わりに、ブロック内のバリアを使用することで改善できます。それにもかかわらず、これらの原子操作を避けようと、いくつかのカーネルで作業を分割する可能性を再考することをお勧めします。

関連する問題