2016-08-27 3 views
0

pyblblas (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) 
관련 문제