我试图使用pyclblas(clblas的python包装器)运行计算,但遇到了一些麻烦。
这是我的代码:
# 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)
这给了我错误:
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,而不是&#39; cl_uint&#39;。 有谁知道问题是什么? 谢谢!
答案 0 :(得分:0)
看起来我有点迟了,但我是pyclblas软件包的开发人员。
在破坏时,您试图使用哪个版本的软件包?在某些旧版本中,您需要将命令队列包装在SWIG接口的列表或元组中以识别您的输入。我已经更新了SWIG界面,以便在您直接传入命令队列时它可以正常工作。发布此版本时的版本,0.8.1,也有一个错误,使其无法正确安装。最新版本0.8.3似乎从pip正确安装,应该满足您的需求。
但是,您的脚本中存在一些需要更正的错误: np.float需要是np.float32(因为你使用的是Sscal而不是Dscal)。此外,您的c_g需要声明为READ_WRITE而不是READ_ONLY,因为Sscal内核将修改后的结果存储回c_g。
此版本使用全新的pip安装正常工作:
#!/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)