2013-04-01 3 views
1

SourceModule의 다른 함수에 의존하는 SourceModule의 함수를 사용할 때 어떻게 함수 호출에 전달합니까? "???" 다음 코드에서 :PyCUDA : 함수를 호출하는 함수의 구문

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)) 

감사합니다.

+0

그래서 대답은 make_square를 \ _ \ _ global \ _ \ _에서 \ _ \ _ device \ _ \ _로 변경하고 make_square_plus_one에 인수로 지정하지 않고 "???"을 제거하십시오. –

답변

0

전통적인 CUDA 실행 모델에서 __global__ 함수는 커널이며 다른 커널에 인수로 전달할 수 없으며 다른 커널에서 호출 할 수 없습니다. 정말해야 make_square처럼 보이는 장치 기능, 뭔가 같은 :이 커널이 완전히 시리얼과 꽤 있음을 주목할 필요가있다

__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; 
} 

: 다음과 같은 실행중인 커널에서 호출

__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); 
    } 
} 

CUDA 커널이 어떻게 작성 될 것으로 예상되는지에 대해 많은 직각을 이룹니다.

+0

확인해 주셔서 감사합니다. 예제 커널이 직렬이라는 것을 알았습니다. 나는 특정 문제에 집중하고 싶었다. –