나는 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 옵션을 사용합니다.
도움 주셔서 감사합니다.
와우, 그게 내가 찾고 있던 해결책이야! 나는이 헤더 파일을 포함하기를 원했고, 그래서 내 커널은 이중 클래스의 정의가 어디인지 알았지 만, 어떻게 알지는 못했다. 나는 "main"안에이 adouble 클래스를 사용하지 않을 것이지만, 나는이 adouble 배열을 gpu에서 얻는 방법을 알아야 할 것이다. 보시다시피, adouble 클래스에는 전용 멤버가 두 개만 있습니다. 'double val' 'double ADVAL' 아마 이것과 비슷한 python 구조체를 만들어야 할 것입니다. 도와 주셔서 대단히 감사합니다! – Banana
이 클래스를 포함 시키려고하면 너무 많은 오류가 발생합니다. "이 선언에는 extern"C "링키지가 없을 수 있습니다. adoublecuda.h를 변경해야합니까 아니면 다른 것이 있습니까? – Banana
필자가 대답했듯이, SourceModule은 코드 문자열을'extern "C"{}'선언으로 구분할 수 있습니다. 코드에서 순수한 C++ 정의를 사용하면 원하지 않습니다. 'no_extern_c = True' 키워드 인수를 사용하여 해당 동작을 비활성화 할 수 있습니다. 출력물에 기호 맹 글링 (mangling)이있을 것입니다. 파이썬 코드에서 accune으로 가져 가야 할 수도 있습니다. 테스트 할 PyCUDA 설치가 없습니다. – talonmies