OpenCL程序/内核在运行时使用clBuildProgram()函数进行构建/编译。我的程序动态创建要构建的内核,因此要花费大量时间来编译它们。当然,看到有很多内核并且它们彼此完全独立,我希望将此工作划分为多个内核,如下面的代码片段所示:
This person似乎有一个非常相似的问题,但这是6年前的,解决方案还不能令人满意imo
ThreadPool tempPool = ThreadPool();
auto start = std::chrono::steady_clock::now();
for (int reps = 0; reps < 50; reps++) {
tempPool.addJob([this] () {
auto start = std::chrono::steady_clock::now();
//These would hold the program sources
std::vector<const char*> sources = {sourceCode.toRawUTF8()};
std::vector<const size_t> sourceLengths = {sourceCode.getNumBytesAsUTF8()};
cl_int ret;
cl_program program = clCreateProgramWithSource(getCLContext()(), 1, sources.data(), sourceLengths.data(), &ret);
// Build the program
ret = clBuildProgram(program, 1, &getCLDevices()[0](), NULL, NULL, NULL);
if (ret) {
//Generic error checking
}
auto singleDuration = std::chrono::duration<double, std::milli>(std::chrono::steady_clock::now() - start).count();
});
}
//Simple way to wait for all jobs to be finished
while (tempPool.getNumJobs() > 0) {
Thread::sleep(1);
}
auto totaDuration = std::chrono::duration <double, std::milli> (std::chrono::steady_clock::now() - start).count();
使用此ThreadPool设置所做的所有事情都会使速度提高5-6(我有8个线程),这是可以预期的。但是,构建OpenCL内核不是。似乎同一时间只能建立一个内核。
有解决方案吗?我在MacOS atm上,但我也会对Linux / Windows感兴趣。
如果没有,是否可以构建不涉及clBuildProgram()但涉及gcc或类似解决方案的OpenCL内核?
答案 0 :(得分:2)
(令您感到惊讶的是,您所用平台的驱动程序还没有多线程。您确定调用确实是并行的。)
如果您仍然受困,则会出现一个可能适用的可怜的骇客,它可以扩展您所引用问题中的解决方案。对于某些驱动程序,clCreateProgramWithBinaries
更快。因此,
clCreateProgramWithSource
,然后再调用clBuildProgram
clGetProgramInfo(...CL_PROGRAM_BINARIES...)
来获取二进制文件,然后通过文件,管道或其他一些进程间通信将其传递回去。再次,我会先检查一下您的设置代码,然后再一起窃听此hack。