Halide에서 extern 함수를 사용하려고합니다. 내 맥락에서, 나는 GPU에서 그것을하고 싶다.GPU가있는 Halide에서 extern 사용
opencl 문을 사용하여 AOT 컴파일로 컴파일합니다. 물론 는 OpenCL을 여전히 CPU를 사용할 수 있습니다, 그래서이 사용 : 지금
halide_set_ocl_device_type("gpu");
을, 모든 compute_root에서 일정이다().
첫 번째 질문은 compute_root() 및 OpenCL gpu를 사용하면 내 프로세스가 일부 CopyHtoD 및 DtoH가있는 장치에서 계산 되었습니까? (또는 호스트 버퍼에있을 것입니다)
두 번째 질문은 extern 기능과 관련이 있습니다. 일부 알고리즘은 Halide가 아니기 때문에 extern 호출을 사용합니다. 통근 호 :
foo.define_extern("cool_foo", args, Float(32), 4);
통근자가 검색 : 통근 "C"의 INT (w INT에서 buffer_t *, INT의 H, INT z의 buffer_t * 아웃) cool_foo {...}
그러나에 cool_foo 함수, 내 buffer_t는 호스트 메모리에만로드됩니다. dev 주소는 0 (기본값)입니다.
내가 알고리즘 전에 메모리를 복사하려고하면 :
halide_copy_to_dev(NULL, &in);
그것은 아무것도하지 않습니다.
나는에서만 사용 가능 장치 메모리 한 경우 : null 인
in.host = NULL;
내 호스트 포인터하지만, 장치 주소는 여전히 0
입니다 (내 경우에 dev_dirty있는 경우에 true와 host_dirty은 false입니다)
아이디어가 있으십니까?
편집
여기 내 코드의 구조이다 (dsharlet에 응답하려면) :
구문 분석 데이터를 올바르게 CPU에. -> GPU에 버퍼 전송 (Halide_copy_to_dev ... 사용) -> Halide 구조에 입력, 파라미터 읽기 및 경계 조건 추가 -> 내 외부 함수로 이동 -> ...
I 내 extern 함수에 유효한 buffer_t가 없다. 나는 compute_root()에서 모든 것을 스케줄하지만 HL_TARGET = host-opencl을 사용하고 ocl을 gpu로 설정합니다. Halide에 들어가기 전에 장치 주소를 읽을 수 있습니다. 괜찮습니다.
이는 할로겐하기 전에, 모든 CPU 물건 (포인터)와 우리가 GPU에
buffer_t k = { 0, (uint8_t *) k_full, {w_k, h_k, num_patch_x * num_patch_y * 3}, {1, w_k, w_k * h_k}, {0}, sizeof(float), };
#if defined(USEGPU)
// Transfer into GPU
halide_copy_to_dev(NULL, &k);
k.host_dirty = false;
k.dev_dirty = true;
//k.host = NULL; // It's k_full
#endif
halide_func(&k)
내부 할로겐을 TRANSFERT했다 : 여기
내 코드의ImageParam ...
Func process;
process = halide_sub_func(k, width, height, k.channels());
process.compute_root();
...
Func halide_sub_func(ImageParam k, Expr width, Expr height, Expr patches)
{
Func kBounded("kBounded"), kShifted("kShifted"), khat("khat"), khat_tuple("khat_tuple");
kBounded = repeat_image(constant_exterior(k, 0.0f), 0, width, 0, height, 0, patches);
kShifted(x, y, pi) = kBounded(x + k.width()/2, y + k.height()/2, pi);
khat = extern_func(kShifted, width, height, patches);
khat_tuple(x, y, pi) = Tuple(khat(0, x, y, pi), khat(1, x, y, pi));
kShifted.compute_root();
khat.compute_root();
return khat_tuple;
}
할로겐 외부 (외부 입력 기능) :
inline ....
{
//The buffer_t.dev and .host are 0 and null. I expect a null from the host, but the dev..
}
외부 스테이지 전에 스테이지를 정의하고 예약하는 코드를 공유 할 수 있습니까? GPU에서 일정이 잡혀 있습니까? 그렇지 않다면 나는 당신이보고있는 행동이 기대된다고 생각합니다. – dsharlet