使用pyclblas进行简单的示例

2024-06-16 12:28:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用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)

这给了我一个错误:

^{pr2}$

文档显示队列应该是pyopencl.CommandQueue,而不是“cl\uint”。 有人知道问题出在哪里吗? 谢谢!在


Tags: toimportpyopenclqueueclascreatenp
1条回答
网友
1楼 · 发布于 2024-06-16 12:28:15

看起来我有点晚了,但我是pyclblas包的开发人员。在

包坏了你想用什么版本的?在一些旧版本中,您需要将命令队列包装在一个列表或元组中,以便SWIG接口识别您的输入。我已经更新了SWIG接口,这样如果您直接传入命令队列,它就可以工作。当你发布这个版本时,0.8.1,也有一个错误,使它无法正确安装。最新版本0.8.3似乎可以从pip正确安装,并且应该能够满足您的需要。在

但是,脚本中有一些错误需要更正: np.浮动必须是np.浮动32(因为您使用的是Sscal而不是Dscal)。另外,您的c_g需要声明为READ_WRITE而不是READ_,因为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)

相关问题 更多 >