2014-02-13 7 views
1

Я использую PyOpenCL для написания кодов OpenCL. Моя программа ядра имеет вход как float2.Как использовать float2 в pyopencl?

__kernel void Pack_Cmplx(__global float2* Data_In, __global float2* Data_Out, int N) 

мне нужно объявить буфер в Python для хранения и вывода для передачи исходных данных для ядра.

Каков эквивалентный тип данных в python для float2? Я попытался DTYPE на NumPy без успеха :(

+0

Это на самом деле работает на float2. Дайте мне знать, если есть ставка ter way! 'dt = np.dtype ([("num1", np.float16), ("num2", np.float16)]) Data_Out = np.empty (100, dtype = dt)'. –

+1

уверен, что он должен быть вектором двух значений «np.float32» вместо float16. – M4rtini

ответ

1

Вот MWE использовать float2 в pyOpenCL программе:.

import numpy as np 

################################################### 
# openCL libraries 
################################################### 
import pyopencl as cl 
import pyopencl.array as cl_array 


deviceID = 0 
platformID = 0 
workGroup=(1,1) 

N = 10 
testData = np.zeros(N, dtype=cl_array.vec.float2) 

dev = cl.get_platforms()[platformID].get_devices()[deviceID] 

ctx = cl.Context([dev]) 
queue = cl.CommandQueue(ctx) 
mf = cl.mem_flags 
Data_In = cl.Buffer(ctx, mf.READ_WRITE, testData.nbytes) 


prg = cl.Program(ctx, """ 

    __kernel void Pack_Cmplx(__global float2* Data_In, int N) 
    { 
     int gid = get_global_id(0); 

     Data_In[gid] = 1; 
    } 
    """).build() 

prg.Pack_Cmplx(queue, (N,1), workGroup, Data_In, np.int32(N)) 
cl.enqueue_copy(queue, testData, Data_In) 


print testData 

Я надеюсь, что помогает

+0

О, я не знал, что для float2 существует встроенный тип данных pyopencl. Что помогает. –

1

Альтернативой использованию cl_array.vec.float2 это просто использовать np.float32 тип и сделать свой NumPy (и OpenCL) буфера в два раза больше.

testData = np.zeros(N*2, dtype=np.float32) 
Data_In = cl.Buffer(ctx, mf.READ_WRITE, testData.nbytes) 
prg = cl.Program(ctx, """ 
    __kernel void Pack_Cmplx(__global float2* Data_In, int N) 
    { 
     int gid = get_global_id(0); 
     Data_In[gid] = 1; // not sure about this tbh. do we set both values to 1 here ? 
    } 
    """).build() 
prg.Pack_Cmplx(queue, (N,1), workGroup, Data_In, np.int32(N))