PyCUDA:调用函数的函数的语法

时间:2013-04-01 10:34:11

标签: 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))

感谢您提供任何信息。

1 个答案:

答案 0 :(得分:0)

在传统的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内核的编写方式非常正交。