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이 값을 사용하는거야 때문에, 나는 한 번 글로벌 메모리에 넣어 할 모든 있도록 노동자는 모든 노동자의 가치를 되풀이하는 대신 그것에 접근 할 수 있습니다.
저는 이것이 정말로 간단해야한다고 생각합니다. 그러나 저는 병렬 컴퓨팅에 익숙하지 않으며 이것을 고치는 방법을 모릅니다.
감사합니다.