2017-03-07 3 views
1

GPU에서 Halide 코드를 실행하고 싶습니다. GPU에서 실행하는 방법과 크로스 컴파일을 수행하는 방법에 대한 자습서 예제가 있습니다. 그러나 크로스 컴파일과 GPU 실행을 결합한 튜토리얼은 없습니다.GPU 용 Halide 크로스 컴파일

크로스 컴파일 자습서의 방법과 동일한 방법으로 시도했습니다. 그러나 나는 표적의 구성을 확신하지 못한다.

target.os = Target::Windows; 
target.arch = Target::X86; 
target.bits = 64; 
... 

target.os = Target::Windows; // ??? 
target.arch = ??? ; 
target.bits = 64; 
std::vector<Target::Feature> gpu_features; 
gpu_features.push_back(Target::OpenCL); 
brighter.compile_to_file(...); 

호스트 컴퓨터 OS가 Windows 인 동안 가상 컴퓨터에서 실행되는 Ubuntu에서 코드를 개발합니다. 그래서 GPU에서 실행하기 위해서는 크로스 컴파일 작업이 필요합니다.

지원 여부

답변

0

비트를 확장하려면 Halide가 단일 필터에서 여러 GPU/가속기/오프로드 아키텍처에 대한 코드를 생성 할 수 있습니다. Target은 호스트 코드가 실행될 CPU의 아키텍처/OS/주소 너비와 허용되는 외부 실행 API 세트를 지정합니다. Funcs은 이러한 API 중 하나로 예약 할 수 있습니다. OpenCL, OpenGL, Cuda 등. 사실, GPU에서 어떤 것을 실행하기 위해서는 적절한 스케줄링이 제공되어야합니다.

가속기 또는 GPU에서 실행되는 코드는 최상위 수준 Target에 지정된 CPU 아키텍처에서 실행되는 함수 내에 포함되어 있습니다.

예를 들어 OpenCL과 OpenGL간에 상당히 원활하게 상호 운용되는 Halide 코드를 작성할 수 있습니다.

우리는 궁극적으로 우리가 지원하는 소스 코드 언어 (현재 C++, JavaScript가 지점에 있음)에서 GPU (등) 코드를 실행하도록 지원할 계획입니다.

GPU 용 독립 실행 형 코드를 생성 할 수 없습니다. 예 : 코드를 호출하는 CPU 코드 래퍼없이 OpenCL을 얻을 수 없습니다.

+0

그냥 명확히하기를 원한다. "using_the_gpu"튜토리얼의 예제를 만든다. curves.compile_to_file (...)으로'curved.compile_jit()'을 변경했습니다. 그래서, 그것은 커널 openCL 코드를 생성했습니다. 따라서이 경우 Halide가 자동으로 생성 한 GPU 커널 코드를 호출하는 데 필요한 CPU 코드 (copy_to_device() 및 copy_from_device() API 포함)가 있습니까? 내 Windows 프로젝트에서, 난 그냥 입력을 지정하고 생성 된 H 파일에서 함수를 호출해야합니다, 맞습니까? – aristg

+0

예, Halide는 GPU에서 커널을 호출하기 위해 CPU 코드를 생성하고 적절한 입력 및 출력과 함께 단일 C/C++ 호출 가능 함수에 넣습니다. OpenCL 코드는 호출자 관점에서 생성 된 함수의 내부 세부 정보입니다. Halide 외부의 CPU에서 데이터에 액세스하기 전에 데이터가 호스트에서 유효한지 확인하려면 copy_from_device 호출을 만들어야합니다. (Halide 내부의 액세스는 자동으로 처리되어야합니다.) 이렇게하면 불필요한 호스트/장치 복사없이 여러 GPU 필터를 연속적으로 실행할 수 있습니다. –

1

GPU 코드를 호출하는 CPU 코드가 여전히 있습니다. 따라서 우분투에서 H 및 OBJ 또는 LIB 파일을 생성하고 Windows 프로젝트에서 Windows에서 사용하십시오.

+0

... target.arch는 CPU 코드의 아키텍처이므로 x86을 사용하십시오. –

관련 문제