pyOpenCL与2D-FFT

2024-09-29 19:26:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用pyFFT对2D数组进行傅立叶变换,然后继续使用另一个OpenCL程序(这里以加倍为例):

gpu_data = cl_array.to_device(queue, tData2D)  
plan.execute(gpu_data.data)  
eData2D = gpu_data.get()  


ctx = cl.Context([cl.get_platforms()[0].get_devices()[0]])
queue = cl.CommandQueue(ctx)
mf = cl.mem_flags
eData2D_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=eData2D)
eData2D_dest_buf = cl.Buffer(ctx, mf.WRITE_ONLY, eData2D.nbytes)
prg = cl.Program(ctx, """
        //#define PYOPENCL_DEFINE_CDOUBLE     // uncomment for double support.
        #include "pyopencl-complex.h"    
        __kernel void sum(const unsigned int ySize,
                              __global cfloat_t *a,
                              __global cfloat_t *b)
        {
          int gid0 = get_global_id(0);
          int gid1 = get_global_id(1);

          b[gid1 + ySize*gid0] = a[gid1 + ySize*gid0]+a[gid1 + ySize*gid0];
        }
        """).build()

prg.sum(queue, eData2D.shape, None, np.int32(Ny), eData2D_buf, eData2D_dest_buf)
cl.enqueue_copy(queue, eData2Dresult, eData2D_dest_buf) 

这个很好用。现在,我想继续使用它,而不是检索数据并将其重新复制到缓冲区eData2D = gpu_data.get()并将其复制回GPU内存{}。在

我在期待这样的事情:

^{pr2}$

但没用。有办法吗? 提前谢谢你的帮助。在


Tags: datagetgpuqueueclglobaldestint
1条回答
网友
1楼 · 发布于 2024-09-29 19:26:19

看起来您正在创建一个全新的上下文来运行第二个程序:

ctx = cl.Context(...)

OpenCL缓冲区仅对创建它的上下文有效,因此如果您想像这样重用缓冲区,则需要确保对两个OpenCL程序/内核使用相同的上下文。在

还可以重用命令队列,而不是创建新队列。在

相关问题 更多 >

    热门问题