2014-12-29 3 views
0

PyOpenCl을 사용하여 기본 스칼라 연산을 수행하는 데 어려움을 겪고 있습니다. 기본적으로 플로팅 타입 배열이 주어진 경우, 각 배열 요소에 스칼라 float 결과를 새로운 버퍼에 저장합니다. 이것은 쉬워야하지만 웬일인지 그것이해야하는 것에 따라 그것을 wroking하지 않고있다. PyOpencl - 잘못된 인수가 kernell에게 전달됨

은 내가 사용하는 코드이다 : (_h와 변수 HOST 변수이고; _G와 변수 디바이스 변수) 예상 OUPUT가

import numpy as np 
import pyopencl as cl 
# Device Init 
ctx = cl.create_some_context() 
queue = cl.CommandQueue(ctx) 
MF = cl.mem_flags 

# Host Initial Variables 
a_h = np.array([1.0, 2.0, 3.0, 4.0]) 
b_h = np.float32(2.0) 

# DEVICE Variable Allocation 
a_g = cl.Buffer(ctx, MF.READ_ONLY | MF.COPY_HOST_PTR, hostbuf=a_h) 
c_g = cl.Buffer(ctx, MF.WRITE_ONLY, a_h.nbytes) 

# DEVICE's Kernel - Multiply each element of the array a_g by the scalar b_g and put the result on the array c_g 
source = """ 
__kernel void mult(float b_g, __global float *a_g, __global float *c_g){ 
    const int gid = get_global_id(0); 
    c_g[gid] = b_g * a_g[gid]; 
} 
""" 

prg = cl.Program(ctx, source).build() 
prg.mult(queue, a_h.shape, None, b_h, a_g, c_g) 

# Export The Result On The DEVICE Back To The HOST 
c_h = np.empty_like(a_h) 
cl.enqueue_copy(queue, c_h, c_g) 

# Output 
print c_h 

이었다

[2.0 4.0 6.0 8.0]

이 있었다 출력 :

[ 2.56000000e+002 5.12000000e+002 -1.73777009e+308 -1.73777009e+308] 

이유를 알 수 없습니다. PyOpenCL 프로젝트 페이지를 읽으려고 시도했지만 솔직히 말해서 많은 부분을 이해하지 못했습니다. 커널 부분을 정확하게하지 않거나 커널 호출 부분을 수행하지 않는 것 같습니다. 나는이 같은 커널을 사용하려고했습니다

:

__kernel void mult(__global float *b_g, __global float *a_g, __global float *c_g) 

하지만 b_g에 대한 포인터를 만들지 않은도 내가 하나를 만드는 방법을 알고 있기 때문에 작동하지 않았다 예상대로. 오류 :

:2:39: error: parameter may not be qualified with an address space 
__kernel void mult(__global float b_g, __global float *a_g, __global float *c_g){ 
           ^

이 뒤에 내 주요 아이디어는 간단하다 : 나는 모든 근로자에게 같은 일반적인 것은 b_g이 값을 사용하는거야 때문에, 나는 한 번 글로벌 메모리에 넣어 할 모든 있도록 노동자는 모든 노동자의 가치를 되풀이하는 대신 그것에 접근 할 수 있습니다.

저는 이것이 정말로 간단해야한다고 생각합니다. 그러나 저는 병렬 컴퓨팅에 익숙하지 않으며 이것을 고치는 방법을 모릅니다.

감사합니다.

답변

0

numpy에서 동일한 배열에 포함 된 모든 객체에는 공통 데이터 유형이 있습니다. 이 데이터 유형은 배열의 dtype 속성에 지정됩니다. (numpy.array doc, numpy datatypes)

배열 a_h의 데이터는 float64 (64 비트 float)입니다. 커널이 32 비트 부동 소수점 (float32)을 기다리고 있으므로이 코드는 a_h과 같습니다. 따라서 4 개의 64 비트 부동 소수점 대신 8 개의 32 비트 부동 소수점을 볼 수 있습니다.

개체를 a_h에 저장하려면 float32으로 저장하십시오. 따라서 다음과 같이 정의하십시오 :

a_h = np.array([[1.0, 2.0, 3.0, 4.0], dtype=np.float32) 
관련 문제