2016-05-03 3 views
0

skcuda.misc.subtractが私の期待通りに放送していません。このコードでは:なぜscikit-cudaはnumpyのような放送を減算しないのですか?

import numpy as np 
import pycuda.gpuarray as gpuarray 
import skcuda.misc as gpumisc 
import pycuda.autoinit 

a = np.ones((3, 1)) 
b = np.ones((1, 3)) 
c = a - b 
assert np.allclose(c, np.zeros((3, 3))) 

a_gpu = gpuarray.to_gpu(a) 
b_gpu = gpuarray.to_gpu(b) 
c_gpu = gpumisc.subtract(a_gpu, b_gpu) 
assert np.allclose(c_gpu.get(), np.zeros((3, 3))) 

私はこのエラーを取得する:

TypeError         Traceback (most recent call last) 
<ipython-input-1-63f3109ba0df> in <module>() 
    11 a_gpu = gpuarray.to_gpu(a) 
    12 b_gpu = gpuarray.to_gpu(b) 
---> 13 c_gpu = gpumisc.subtract(a_gpu, b_gpu) 
    14 assert np.allclose(c_gpu.get(), np.zeros((3, 3))) 

/appl/pm/vendor/dev/python/lx-x86_64/anaconda2/lib/python2.7/site-packages/skcuda/misc.pyc in subtract(x_gpu, y_gpu) 
    1032  """ 
    1033 
-> 1034  return binaryop_2d("-", operator.sub, False, x_gpu, y_gpu) 
    1035 
    1036 def multiply(x_gpu, y_gpu): 

/appl/pm/vendor/dev/python/lx-x86_64/anaconda2/lib/python2.7/site-packages/skcuda/misc.pyc in binaryop_2d(c_op, py_op, commutative, x_gpu, y_gpu) 
    982    return binaryop_matvec(c_op, y_gpu, x_gpu.ravel(), axis=0) 
    983 
--> 984  raise TypeError("unsupported combination of shapes") 
    985 
    986 def add(x_gpu, y_gpu): 

TypeError: unsupported combination of shapes 

誰も私が間違ってやっているかを見ますか?

(私は複数の単語を記述せずに投稿するように見えることはできません。明日明日明日ゾッこのささいなペースでの日からその日に記録された時間の最後の音節に...)

答えて

1

のメモリモデルcuda(そして一般にGPU)は、任意の放送操作を非常に魅力的でない提案にしています。連続した読み取り/書き込みのみが効率的です。したがって、スレッドは連続したストライドに沿って整列する必要があります。これは、多くの状況下でひどく最適ではない性能を生じさせない一般的な放送機能を書くことを非常に困難にする。

+0

ありがとう。私の簡単な例を得るために、連続した歩幅に沿ってどのように整列させるのですか? –

1

scikit-cudaに縛られていないなら、私はTensorFlowをCUDAバックエンドに使うことをお勧めします。それは、その事業者の多くでネイティブに放送をサポートしています。あなたの例:

import numpy as np 
import tensorflow as tf 

a = np.ones((3, 1)) 
b = np.ones((1, 3)) 
c = a - b 
assert np.allclose(c, np.zeros((3, 3))) 

with tf.device('/cpu:0'): 
    a_gpu = tf.constant(a) 
    b_gpu = tf.constant(b) 
    c_gpu = tf.sub(a_gpu, b_gpu) 

sess = tf.Session(config=tf.ConfigProto(log_device_placement=False)) 
c_gpu_out = sess.run(c_gpu) 

np.testing.assert_allclose(c_gpu_out, np.zeros((3, 3))) 
関連する問題