我是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
语句中索引或域的定义有错误。在
有什么想法吗?在
目前没有回答
相关问题 更多 >
编程相关推荐