2013-04-11 7 views
5

次のPythonコードはPyOpenCLを使用して配列a_plus_bを配列bの要素の合計で埋めています(これは私の実際の目的ではありませんが、それでも問題を示す最も簡単なコードです)。なぜこのopenclコードは非決定的ですか?

import pyopencl as cl 
import numpy as np 
import numpy.linalg as la 

height = 50 
width = 32 

b = np.arange(width,dtype=np.int32) 

ctx = cl.create_some_context() 
queue = cl.CommandQueue(ctx) 

mf = cl.mem_flags 
b_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b) 
dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, height*4) 

prg = cl.Program(ctx, """ 
    __kernel void sum(__global const int *b, __global int *c) 
    { 
     int x = get_global_id(1); 
     int y; 
     c[x] = 0; 
     for(y=0;y<get_global_size(0);y++) { 
      c[x] += b[y]; 
     } 
    } 
    """).build() 

prg.sum(queue, (width,height), None, b_buf, dest_buf) 

a_plus_b = np.empty(height,dtype=np.int32) 
cl.enqueue_copy(queue, a_plus_b, dest_buf) 

print(np.sum(b)) 
print(a_plus_b) 
print(np.sum(a_plus_b-np.sum(b))) 

出力を与える:私は32から33にを変更した場合

496 
[496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 
496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 496 
496 496 496 496 496 496 496 496 496 496 496 496 496 496] 
0 

しかし、アレイはもはや何度も何度も同じ要素ではありません。

528 
[555 557 555 559 560 528 560 560 528 528 528 528 528 528 528 528 528 528 
528 528 528 531 540 569 581 528 705 591 560 560 545 560 560 528 560 528 
528 528 528 528 528 528 528 528 528 528 528 532 533 535] 
752 

実際、コードを実行するたびに異なる結果が生成されます。

528 
[560 560 559 560 560 560 560 528 528 528 528 528 528 528 528 528 528 528 
528 528 528 560 528 514 565 553 621 650 560 560 560 560 560 528 528 528 
528 528 528 528 528 528 528 528 549 528 528 544 528 537] 
724 

どういう意味がありますか?何もない

答えて

2

あなたはWIDTH x HEIGHTの作業アイテムを実行しています。カーネル内のXの値ごとに、CID [0]を0に設定して、Yループでそれを更新するという、WIDTH作業項目がまったく同じことを並行して行います。これらのWIDTH作業項目はすべてC [X]を読んで、多かれ少なかれ同時に更新します。この「多かれ少なかれ」が、あなたが観察するバリエーションの原因です。

あなたのアルゴリズムは1Dで、HEIGHT作業項目だけを実行し、WIDTHをカーネル引数として渡す必要があります。 C [X]をレジスタ "SUM"に置き換え、最後に1つのC [X] = SUMを実行します。

+0

それが問題を解決しました。私はそれが私が怠け者であり、実際のパラメータとして配列の長さを渡さないために得られるものだと思います。 – user640078

関連する問題