"OpenCL和pyOpenCL中的二维数组操作"

2024-09-27 00:19:45 发布

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

我是opencl/pyopencl的新手,我正试图理解如何在2D数组上进行基本操作。下面是一个典型的numpy函数的示例,我试图在openCL中编写:

def fct_np(nx, nz, dx, dz, dt, rhou, rhov, rho):

    tau11, tau22 = np.zeros((nx, nz)), np.zeros((nx, nz))

    Erhou = rhou/rho
    Erhov = rhov/rho

    tau11[1:-1,:] = ( Erhou[2:,:] - Erhou[:-2,:] ) * dx
    tau22[:,1:-1] = ( Erhov[:,2:] - Erhov[:,:-2] ) * dz

    rhou = rhou - dt*tau11
    rhov = rhov - dt*tau22

    return rhou, rhov

以及我写内核的尝试

^{pr2}$

我称内核为:

import pyopencl as cl
import numpy as np

# Init values
nx, nz = 1024, 256
dx, dz = 1/1e-4, 1/1e-4
dt = 1.5e-7
rho  = np.random.rand(nx, nz)
rhou = np.random.rand(nx, nz)
rhov = np.random.rand(nx, nz)

### Create CL instance
ctx = cl.create_some_context()

queue = cl.CommandQueue(ctx,
       properties=cl.command_queue_properties.PROFILING_ENABLE)  

### Initialize buffers
mf = cl.mem_flags
rhou_cl_in = cl.Buffer(ctx, mf.READ_WRITE |mf.COPY_HOST_PTR, hostbuf=rhou)
rhov_cl_in = cl.Buffer(ctx, mf.READ_WRITE |mf.COPY_HOST_PTR, hostbuf=rhov)
rho_cl_in  = cl.Buffer(ctx, mf.READ_WRITE |mf.COPY_HOST_PTR, hostbuf=rho)

### Load kernel
kernel_code = open('fct_cl.cl', 'r').read()

### build kernel
prg = cl.Program(ctx, kernel_code).build()

### Execute 
global_size = rho.shape
local_size  =  (2**2, 2**2)
ex = prg.fct_cl(queue, global_size, local_size, np.int32(nx), np.int32(nz), np.float64(dt), np.float64(dx), np.float64(dz), rho_cl_in, rhou_cl_in, rhov_cl_in)

### Init outputs
rhou_cl  = np.empty_like(rhou)
rhov_cl  = np.empty_like(rhov)

### Get ouput from GPU -> Host
cl.enqueue_copy(queue, rhou_cl, rhou_cl_in)
cl.enqueue_copy(queue, rhov_cl, rhov_cl_in)

rhou_np, rhov_np = fct_np(nx, nz, dx, dz, dt, rhou, rhov, rho)

print '--------------------------------'
print 'cl & np rhou equal ? ' + `np.array_equal(rhou_np, rhou_cl)`
print 'cl & np rhov equal ? ' + `np.array_equal(rhov_np, rhov_cl)`

计算Erhou和{}是可以的。在

这个问题来自于tau11和{}的计算。在

numpy和{}的结果非常接近,但似乎opencl中的行和列是颠倒的! 我认为在cl文件中的if语句中索引或域的定义有错误。在

有什么想法吗?在


Tags: inqueueclnpdtctxnxmf

热门问题