Да, вы можете использовать заголовки в OpenCL именно для того, что вы предлагаете. Каждый файл ядра будет содержать заголовок и скомпилировать его.
Опция "-I" используется только для указания пути для включений. Если ваши включения находятся в вашем рабочем каталоге, это не обязательно. Вот пример:
/////////////////////////////////////////////////////////////////
// Load CL file, build CL program object, create CL kernel object
/////////////////////////////////////////////////////////////////
std::string sourceStr = FileToString(params.kernelFile);
cl::Program::Sources sources(1, std::make_pair(sourceStr.c_str(), sourceStr.length()));
cl::Program program = cl::Program(oclHandles.context, sources);
program.build(oclHandles.devices,"-I c:/Includes/");