1

やあ、私は pyopencl でこのコードを書いてスパース ランダム ベクトルを取得しましたが、問題はインデックス付き配列に値を書き込めないことです。何が問題なのですか? 出力は常にゼロ!!

ここに私のコードがあります

import pyopencl as cl
import numpy as np
from pyopencl import array 
from pyopencl import clrandom

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx,
        properties=cl.command_queue_properties.PROFILING_ENABLE)

x=array.zeros(queue, 512, dtype=np.float32 )

indices = clrandom.rand(queue, 17 , dtype=np.int32 ,luxury=2, a=1 , b=512)

clrandom.RanluxGenerator(queue,luxury=0).fill_normal(x[indices], mu=0, sigma=1)

print x
4

1 に答える 1

0

x[indices]ビューではなくコピーを返しているようです。

>>> import pyopencl as cl
>>> import numpy as np
>>> from pyopencl import array 
>>> from pyopencl import clrandom
>>> 
>>> ctx = cl.create_some_context()
>>> queue = cl.CommandQueue(ctx,
...         properties=cl.command_queue_properties.PROFILING_ENABLE)
>>> 
>>> x=array.zeros(queue, 512, dtype=np.float32 )
>>> 
>>> indices = clrandom.rand(queue, 17 , dtype=np.int32 ,luxury=2, a=1 , b=512)
>>> x_cp = x[indices]
>>> x_cp
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.], dtype=float32)
>>> clrandom.RanluxGenerator(queue,luxury=0).fill_normal(x_cp, mu=0, sigma=1)
>>> x_cp
array([ 1.16633689,  0.65845662,  1.97530341, -0.53728914,  1.38982224,
        1.47071588, -0.73042828,  1.29367638,  1.2390343 ,  2.89497447,
       -0.75589401,  0.04600764, -4.28992653,  0.50232059,  0.4881362 ,
        0.01112503, -0.46737072], dtype=float32)
>>> x[indices]
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
        0.,  0.,  0.,  0.], dtype=float32)

次のことを試すことができます。

  1. 配列と同じ次元を持つ float32 配列を作成し、それをindices呼び出しましょうtmp_random
  2. 乱数を生成して格納するtmp_random
  3. indicestmp_random、およびxを引数として取るカーネルを書きます。各スレッドは から 1 つのインデックスindicesとそれに対応する乱数を読み取りtmp_random、 の正しい場所に格納しxます。
于 2014-04-08T10:40:49.193 に答える