2012-07-02 7 views
6

나는 cuda_runtime.h의 일부 정의를 사용하는 C++로 작성된 클래스가 있습니다. 이것은 ADOL-C라는 오픈 소스 프로젝트의 일부입니다. here을 가질 수 있습니다!PyCUDA의 SourceModule에 C++/CUDA 클래스 전달하기

이것은 CUDA-C를 사용하고있을 때 작동하지만, 가능하면이 클래스를 PyCUDA로 가져오고 싶습니다. 따라서이 클래스를 커널 내부 ('main'이 아님)에서 사용하여 함수의 파생물을 계산하는 데 사용되는 특정 변수를 정의합니다. 이 클래스를 PyCUDA의 SourceModule에 전달할 수있는 방법이 있습니까?

저는 비슷한 질문을했지만, 여기에 대해서는 좀 더 설명하고 싶습니다. 그래서 nvcc -cubin (talonmies 덕분에)을 사용하여 내 C 코드를 컴파일 한 다음 driver.module_from_file()을 사용하여 가져 오는 솔루션이 있지만 SourceModule을 사용하여 .py 파일 내부에 해당 커널을 작성하고 싶습니다. 보다 사용자 친화적 일 수 있습니다. 내 예는 다음과 같이 보일 것이다 :이 그냥 생각입니다 ...

from pycuda import driver, gpuarray 
from pycuda.compiler import SourceModule 
import pycuda.autoinit 
kernel_code_template=""" 
__global__ void myfunction(float* inx, float* outy, float* outderiv) 
{ 
    //defining thread index 
    ... 
    //declare dependent and independet variables as adoubles 
    //this is a part of my question 
    adtl::adouble y[3]; 
    adtl::adouble x[3]; 
    // ... 
} 
""" 

,하지만 SourceModule은 무엇인지 "adouble의", 그들은 클래스 정의 adoublecuda.h에 정의되어 있기 때문에, 그렇게되지 않습니다 I 내 질문에 대해 더 잘 이해하기를 바랍니다. 아무도 내가 어디에서 시작해야하는지 모른다. 그렇지 않다면이 커널을 CUDA-C에 작성하고 nvcc -cubin 옵션을 사용합니다.

도움 주셔서 감사합니다.

답변

6

PyCUDA SourceModule 시스템은 실제로 파일로 전달하는 코드를 가져 와서 nvcc으로 파일을 큐빈 파일로 컴파일하고 (선택적으로) 해당 큐브 파일을 현재 CUDA 컨텍스트로로드하는 방법 일뿐입니다. PyCUDA 컴파일러 모듈은 CUDA 커널 구문이나 코드에 대해 전혀 알지 못하며 컴파일 된 코드에 거의 영향을 미치지 않습니다. C++ 심볼 맹 글링을 중지하기 위해 사용자가 제출 한 코드를 extern "C" { } 선언으로 구분할 수 있기 때문에 거의 한정어입니다. 그래서

내가 당신에 대해 물어 무슨 생각을 할, 당신은 단지 장치 코드가 제출 된 문자열에서 필요로 어떤 헤더에 대한 #include 문, 그리고 include_dirs를 통해 전달 된 파이썬 목록의 검색 경로 의 적절한 설정을 필요로한다 키워드 옵션. 이 같은 것을 할 경우 :

from pycuda import driver, gpuarray 
from pycuda.compiler import SourceModule 
import pycuda.autoinit 
kernel_code_template=""" 

#include "adoublecuda.h" 
__global__ void myfunction(float* inx, float* outy, float* outderiv) 
{ 
    //defining thread index 
    ... 
    //declare dependent and independet variables as adoubles 
    //this is a part of my question 
    adtl::adouble y[3]; 
    adtl::adouble x[3]; 
    // ... 
} 

""" 

module = SourceModule(kernel_code_template, include_dirs=['path/to/adoublecuda']) 

을하고 자동적으로 작동합니다 (테스트되지 않은 메모를, 자신의 위험에 사용).

+0

와우, 그게 내가 찾고 있던 해결책이야! 나는이 헤더 파일을 포함하기를 원했고, 그래서 내 커널은 이중 클래스의 정의가 어디인지 알았지 만, 어떻게 알지는 못했다. 나는 "main"안에이 adouble 클래스를 사용하지 않을 것이지만, 나는이 adouble 배열을 gpu에서 얻는 방법을 알아야 할 것이다. 보시다시피, adouble 클래스에는 전용 멤버가 두 개만 있습니다. 'double val' 'double ADVAL' 아마 이것과 비슷한 python 구조체를 만들어야 할 것입니다. 도와 주셔서 대단히 감사합니다! – Banana

+0

이 클래스를 포함 시키려고하면 너무 많은 오류가 발생합니다. "이 선언에는 extern"C "링키지가 없을 수 있습니다. adoublecuda.h를 변경해야합니까 아니면 다른 것이 있습니까? – Banana

+0

필자가 대답했듯이, SourceModule은 코드 문자열을'extern "C"{}'선언으로 구분할 수 있습니다. 코드에서 순수한 C++ 정의를 사용하면 원하지 않습니다. 'no_extern_c = True' 키워드 인수를 사용하여 해당 동작을 비활성화 할 수 있습니다. 출력물에 기호 맹 글링 (mangling)이있을 것입니다. 파이썬 코드에서 accune으로 가져 가야 할 수도 있습니다. 테스트 할 PyCUDA 설치가 없습니다. – talonmies