callable program을 사용하면 OptiX 7 program set 내에서 추가적인 프로그래밍이 가능하다. 이러한 program은 SBT의 index를 사용하여 호출된다. index로 함수를 함수를 호출하면 program을 다시 컴파일할 필요 없이 runtime에 함수 호출의 대상을 변경할 수 있다. 이러한 유연성 향으로 사용자 입력에 따라 다양한 shading 효과를 구현하거나 scene 설정에 따라 program을 customizing할 수 있다.
https://raytracing-docs.nvidia.com/optix7/guide/index.html#callables#callables
OptiX 7에는 direct callable과 continuation callable의 두 가지 유형의 callable program이 존재한다. direct callable과 달리 continuation callable은 optixTrace 함수를 호출할 수 있다. direct callable은 즉시 호출되지만, 추가 기능으로 인해 continuation callable은 scheduler에서 실행해야 한다. 따라서 continuation callable을 실행할 때 추가 overhead가 발생할 수 있다.
continuation-callable program은 다른 continuation-callable program에서만 호출할 수 있으므로 optixTrace를 호출해야 하는 nested callable은 continuation callable로 표시해야 한다. 이는 ray를 trace하는 callable에서 Shader network를 생성할 때 의미가 있다. 이러한 경우 전반적인 성능 향상을 위해 shader network를 re-factoring하여 optixTrace 호출을 피하는 것이 좋다.
continuation callable을 사용하려면 특히 해당 코드 블록이 divergent code execution의 일부인 경우 전반적인 성능이 향상될 수 있다. 간단한 예로 다양한 노이즈 함수나 복잡한 bitmap network와 같은 다양한 material parameter input을 예로들 수 있다. 이러한 각 입력에 연속 callable을 사용하면 schedular가 복잡한 snippets을 보다 효율적으로 실행하고 대부분의 divergent code executeion을 잠재적으로 해결할 수 있다.
direct callable은 exception을 제외한 모든 program type에서 호출할 수 있다. continuation callable은 ray generation, closest hit, miss programd에서 호출할 수 있다.
callable program을 호출하는 데는 세 가지 파트가 있다.
이러한 다양한 템플릿의 device code compile은 C++11 이상이 필요하다.
sbtIndex 인자는 optixTrace에 OptixShaderBindingTable::callablesRecordBase parameter로 지정된 callable SBT 항목의 배열의 index이다. callable의 program group에는 direct callable grogram과 continuation callable program이 모둠 포함될 수 있지만, 이러한 program은 SBT에서 단일 record를 공유한다.
함수를 적극적으로 inlining하면 실행 시간이 가장 짧아지는 경우가 많지만, inlining으로 인해 compile 시간이 길어질 수 있다. OptiX는 이름으로 참조할 수 있고 module 간 link에 참여할 수 있는 non-inlined function의 사용을 지원한다. 그러나 non-inlined function은 module 생성 중에 자동으로 inline되지 않으며 OptiX device 측 함수를 사용할 수 없다.
이 자동 inlining을 비활성화하려면 함수 이름에 접두사 __optix_enabled__을 추가하여 함수를 OptiX enabled로 정의해야 한다. OptiX enabled function는 SBT 항목이 없으므로 관련 데이터가 없다. 이는 exception program 내를 제외한 모든 다른 OptiX enabled function에서 호출할 수 있다.
모든 function와 마찬가지로 함수의 주소를 가져오는 것은 허용되지 않는다. 함수 pointer semantic이 필요한 경우 direct callable function을 호출하야 한다. Optix enabled function은 direct callable function와 유사한 컴파일 및 runtime overhead를 발생시킬 수 있다.