PyOpenCL, не удалось установить аргументы. Неверные значения

Я получил предоставленное ядро ​​​​OpenCL для выполнения в среде C, но когда я пытаюсь запустить его с помощью PyOpenCL с предоставленным кодом, я получаю следующую ошибку:

> Traceback (most recent call last):
>  File "integral.py", line 38, in <module>
>    example.execute()
>  File "integral.py", line 26, in execute
>    self.program.integrate_f(self.queue, self.a, None, self.a, self.dest_buf)
>  File "/Library/Python/2.7/site-packages/pyopencl-2013.3-py2.7-macosx-10.9-
> x86_64.egg/pyopencl/__init__.py", line 506, in kernel_call
>    self.set_args(*args)
>  File "/Library/Python/2.7/site-packages/pyopencl-2013.3-py2.7-macosx-10.9-
> x86_64.egg/pyopencl/__init__.py", line 559, in kernel_set_args
>    % (i+1, str(e), advice))
> pyopencl.LogicError: when processing argument #1 (1-based): Kernel.set_arg failed: invalid value -
> invalid kernel argument

Так что кажется, что я передаю ядру недопустимый аргумент, но я понятия не имею, почему оно жалуется на это. Любые идеи?

import pyopencl as cl
import numpy

class CL:

    def __init__(self):
        self.ctx = cl.create_some_context()
        self.queue = cl.CommandQueue(self.ctx)

    def loadProgram(self, filename):
        #read in the OpenCL source file as a string
        f = open(filename, 'r')
        fstr = "".join(f.readlines())
        print fstr
        #create the program
        self.program = cl.Program(self.ctx, fstr).build()

    def popCorn(self, n):
        mf = cl.mem_flags

        self.a = int(n)

        #create OpenCL buffers
        self.dest_buf = cl.Buffer(self.ctx, mf.WRITE_ONLY, bumpy.empty(self.a).    nbytes)    

    def execute(self):
        self.program.integrate_f(self.queue, self.a, None, self.a, self.dest_buf)
        c = numpy.empty_like(self.dest_buf)
        cl.enqueue_read_buffer(self.queue, self.dest_buf, c).wait()
        print "a", self.a
        print "c", c


if __name__ == "__main__":
    example = CL()
    example.loadProgram("integrate_f.cl")
    example.popCorn(1024)
    example.execute()
__kernel void integrate_f(const unsigned int n, __global float* c)
{
    unsigned int i = get_global_id(0);
    float x_i = 0 + i*((2*M_PI_F)/(float)n);
    if (x_i != 0 || x_i != 2*M_PI_F)
    {
        c[i] = exp(((-1)*(x_i*x_i))/(4*(M_PI_F*M_PI_F)));
    }
    else c[i] = 0;
}

person ra91    schedule 15.12.2013    source источник


Ответы (1)


При вызове ядра есть две ошибки. Ошибка, связанная с вашей обратной трассировкой, заключается в том, что self.a является объектом Python int, а ядро ​​​​ожидает целое число без знака OpenCL, которое, в частности, является 32-битным. Вам нужно явно передать 32-битное целое число, используя (например) numpy.int32(self.a). Вторая ошибка заключается в том, что аргумент глобального размера работы должен быть кортежем.

Таким образом, правильный код для вызова вашего ядра должен быть таким:

self.program.integrate_f(self.queue, (self.a,), None, numpy.int32(self.a), self.dest_buf)
person jprice    schedule 15.12.2013