2013-07-22 48 views
1

您好我在pyopencl中編寫此代碼以獲得稀疏隨機向量,但問題是我無法將任何值寫入索引數組有什麼問題?輸出始終爲零!在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 

回答

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. 創建具有相同的尺寸,你indices陣列FLOAT32陣列,讓叫它tmp_random
  2. 產生隨機數,並把它們存儲在tmp_random
  3. 編寫內核這需要indicestmp_randomx作爲參數。每個線程從indices中讀取一個索引,並從tmp_random中讀取相應的隨機數並將其存儲在x的正確位置。