2016-08-27 9 views
0

私はpyclblas(clblasのpythonラッパー)を使用して計算を実行しようとしていましたが、何らかの問題に遭遇しました。単純な例のためのpyclblasの使用

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/spyderlib/widgets/externalshell/sitecustomize.py", line 540, in runfile 
    execfile(filename, namespace) 
    File "/home/name/.spyder2/.temp.py", line 49, in <module> 
    res = pyclblas.clblasSscal(len(c_np), 1.0, c_g, 0, 1, queue, None) 
    File "/usr/local/lib/python2.7/dist-packages/pyclblas.py", line 245, in clblasSscal 
    return pyclblas_swig.clblasSscal(N, alpha, X, offx, incx, commandQueues, eventWaitList) 
TypeError: in method 'clblasSscal', argument 6 of type 'cl_uint' 

ドキュメントはキューがpyopencl.CommandQueue、ない 'cl_uint' であることを述べている:

# imports (my python is 2.7) 
from __future__ import absolute_import, print_function 
import numpy as np 
import pyopencl as cl 
import pyclblas 

# create some generic structures according to pyopencl tutorial 
ctx = cl.create_some_context() 
queue = cl.CommandQueue(ctx) 
mf = cl.mem_flags 

# create a vector and a buffer 
c_np = np.random.rand(50000).astype(np.float) 
c_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=c_np) 

# use pyclblas to make a calculation with the vector 
res = pyclblas.clblasSscal(len(c_np), 1.0, c_g, 0, 1, queue, None) 

これは私にエラーを与える:

は、ここに私のコードです。 問題の内容を知っている人はいますか? ありがとう!

答えて

0

私は少し遅れたようですが、私はpyclblasパッケージの開発者です。

壊れたときにどのバージョンのパッケージを使用しようとしていましたか?古いバージョンの中には、コマンド・キューをリストまたはタプルでラップして、SWIGインターフェースが入力を認識する必要があるものがありました。私はそれ以来コマンドキューに直接渡す場合に動作するようにSWIGインターフェイスを更新しました。あなたが投稿したときのバージョン、0.8.1にもバグがあり、正しくインストールされていませんでした。 0.8.3の最新バージョンがpipから正しくインストールされているように見えます。

np.floatはnsc.float32にする必要があります(Dscalの代わりにSscalを使用しているため)スクリプトにいくつかのバグがありました。また、c_gはREAD_ONLYの代わりにREAD_WRITEと宣言する必要があります。これは、Sscalカーネルが変更された結果をc_gに戻すためです。

このバージョンでは、新鮮なピップインストールを使用して私のために正しく動作:

#!/usr/bin/env python 
import numpy as np 
import pyopencl as cl 
import pyclblas 
import sys 

alpha = float(sys.argv[1]) 

# create some generic structures according to pyopencl tutorial 
ctx = cl.create_some_context() 
queue = cl.CommandQueue(ctx) 
mf = cl.mem_flags 

# create a vector and a buffer 
c_np = np.random.rand(50000).astype(np.float32) 
c_g = cl.Buffer(ctx, mf.READ_WRITE, size=c_np.nbytes) 
cl.enqueue_copy(queue, c_g, c_np) 

# use pyclblas to make a calculation with the vector 
res = pyclblas.clblasSscal(len(c_np), alpha, c_g, 0, 1, queue, None) 



import scipy.linalg.blas 
res_np = np.empty_like(c_np) 
cl.enqueue_copy(queue, res_np, c_g) 
exp_np = np.copy(c_np) 
scipy.linalg.blas.sscal(alpha, exp_np) 

print np.linalg.norm(c_np), np.linalg.norm(res_np), np.linalg.norm(exp_np) 
print np.linalg.norm(exp_np - res_np) 
関連する問題