PyCUDA: синтаксис для функции, которая вызывает функцию

При использовании функции из SourceModule, которая зависит от другой функции в SourceModule, как мне передать ее в вызове функции, т.е. что такое "???" в следующем коде:

import numpy
import pycuda.autoinit
import pycuda.driver as drv
from pycuda.compiler import SourceModule

mod = SourceModule("""
__global__ void make_square(float *in_array, float *out_array)
{
  int i;
  int N = 5;
  for (i=0; i<N; i++)
  {
    out_array[i] = pow(in_array[i],2);
  }
}
__global__ void make_square_add_one(float *in_array, float *out_array, void make_square(float *, float *))
{
  int N = 5;
  make_square(in_array,out_array);
  for (int i=0; i<N; i++)
    out_array[i] = out_array[i] + 1;
}
""")

make_square = mod.get_function("make_square")
make_square_add_one = mod.get_function("make_square_add_one")
in_array = numpy.array([1.,2.,3.,4.,5.]).astype(numpy.float32)
out_array = numpy.zeros_like(in_array).astype(numpy.float32)
make_square_add_one(drv.In(in_array), drv.Out(out_array), ??? , block = (1,1,1), grid = (1,1))

Спасибо за любую информацию.


person Oster R.    schedule 01.04.2013    source источник
comment
Так что, возможно, ответ заключается в том, чтобы изменить make_square с __global__ на __device__, не делать его аргументом в make_square_plus_one и избавиться от ??? ,.   -  person Oster R.    schedule 01.04.2013


Ответы (1)


В традиционной модели выполнения CUDA функции __global__ являются ядрами, и их нельзя передавать в качестве аргументов другим ядрам, и они не могут вызываться другими ядрами. Похоже, что make_square действительно должна быть функцией устройства, например:

__device__ void make_square(float *in_array, float *out_array)
{
  int i;
  for (i=0; i<5; i++)
  {
    out_array[i] = pow(in_array[i],2);
  }
}

который затем вызывается из работающего ядра как:

__global__ void make_square_add_one(float *in_array, float *out_array)
{
  int N = 5;
  make_square(in_array,out_array);
  for (int i=0; i<N; i++)
    out_array[i] = out_array[i] + 1;
}

Стоит отметить, что это ядро ​​полностью последовательное и в значительной степени ортогональное тому, как ожидается, что ядра CUDA будут написаны.

person talonmies    schedule 01.04.2013
comment
Спасибо за подтверждение. Я понимаю, что пример ядра является последовательным. Я хотел сосредоточиться на конкретном вопросе. - person Oster R.; 01.04.2013