2016-08-27 5 views
0

Я пытался запустить вычисление с помощью pyclblas (оболочка python для clblas), но столкнулся с некоторыми проблемами.Использование pyclblas для простого примера

Вот мой код:

# 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'. Кто-нибудь знает, в чем проблема? Спасибо!

ответ

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.

Эта версия работает правильно для меня, используя свежий пип установки:

#!/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) 
Смежные вопросы