【问题标题】:pyopencl Call has wrong number of parameterspyopencl 调用的参数数量错误
【发布时间】:2014-04-28 15:52:34
【问题描述】:

我在 pyopencl 中遇到了这个错误:

pyopencl.RuntimeError: clBuildProgram failed: invalid binary - 

Build on <pyopencl.Device 'GeForce GTX 470' on 'NVIDIA CUDA' at 0x263c1b0>:

ptxas application ptx input, line 116; error   : Call has wrong number of parameters
ptxas fatal   : Ptx assembly aborted due to errors

这是一段 Python 代码:

    u_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=u)
    v_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=v)
    d_dev = cl_array.to_device(queue, delta)
    cont_buf = cl.Buffer(ctx, mf.READ_WRITE, size=cont1.nbytes)
    P_buf = cl.Buffer(ctx, mf.WRITE_ONLY, size=P.nbytes)
    sigma_buf = cl.Buffer(ctx, mf.READ_WRITE, size=sigma.nbytes)
    cl.enqueue_write_buffer(queue, sigma_buf, sigma)
    kernel = cl.Program(ctx, forward_kernel).build()
    kernel.forward(queue, u.shape, None, u_buf, v_buf, d_dev.data, numpy.int16(l), cont_buf, P_buf, sigma_buf)

和我的内核的开始:

__kernel void forward(__global const int *u,
                  __global const int *v,
                  __global int *d,
                  const int l,
                  int cont,
                  __global int *P,
                  __global int *sigma )
{
    int gid = get_global_id(0);
...

u, v, d, P, sigma 是 numpy 数组,l 是整数 (np.int_),cont1 是布尔值。

【问题讨论】:

  • 在内核中查找未定义的函数调用。有时我不小心留下了 printf() 电话。您还可以查看生成的 .ptx 以获取调用语句。在 linux 下,您可以检查 ~/.nv 计算缓存中生成的 .ptx 文件。

标签: pyopencl


【解决方案1】:

我不是 100% 确定您将要做什么,但也许以下在我的机器上运行的示例会有所帮助:

import numpy as np
import pyopencl as cl
import pyopencl.array as cl_array

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

dev = cl.get_platforms()[platformID].get_devices()[deviceID]
ctx = cl.Context([dev])
queue = cl.CommandQueue(ctx)

mf = cl.mem_flags

u = np.zeros([N], dtype = int)
v = np.ones([N], dtype = int)
delta = v - u
cont1 = np.int(4)
l = np.int32(3)
P = v
sigma = v


u_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=u)
v_buf = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=v)
d_dev = cl_array.to_device(queue, delta)
P_buf = cl.Buffer(ctx, mf.WRITE_ONLY, size=P.nbytes)
sigma_buf = cl.Buffer(ctx, mf.READ_WRITE, size=sigma.nbytes)
cl.enqueue_write_buffer(queue, sigma_buf, sigma)


prg = cl.Program(ctx, """__kernel void forward(__global const int *u,
              __global const int *v,
              __global int *d,
              int l,
              int cont,
              __global int *P,
              __global int *sigma )
{
    int gid = get_global_id(0);
    d[gid] = gid;
}""").build()

prg.forward(queue, u.shape, None, u_buf, v_buf, d_dev.data, np.int32(l), np.int32(cont1), P_buf, sigma_buf)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-10
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2021-07-15
    相关资源
    最近更新 更多