簡體   English   中英

使用pyclblas作為一個簡單的例子

[英]Using pyclblas for a simple example

我試圖使用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,而不是'cl_uint'。 有誰知道是什么問題嗎? 謝謝!

看來我有點晚了,但我是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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM