2014-02-13 12 views
1

我正在使用PyOpenCL編寫OpenCL代碼。我的內核程序有一個輸入爲float2。如何在pyopencl中使用float2?

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

我需要在python聲明一個緩衝器,用於存儲和輸出用於傳遞輸入的內核。

python中的等效數據類型爲float2?我試過沒有成功:(

+0

這實際上適用於FLOAT2。讓我知道如果有賭注三路! 'dt = np.dtype([(「num1」,np.float16),(「num2」,np.float16)]) Data_Out = np.empty(100,dtype = dt)'。 –

+1

相當確定它應該是兩個'np.float32'值的向量而不是float16。 – M4rtini

回答

1

這裏numpy的D型處於pyOpenCL程序使用FLOAT2一個MWE:

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

哦,我不知道有一個由pyopencl爲float2內置的數據類型。這有幫助。 –

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))