【发布时间】:2014-08-27 22:22:58
【问题描述】:
好吧,我有一个程序可以在 GPU 上生成、JIT 编译和运行 PTX 子程序。程序运行得很好,运行时间也很好——与 CPU 相比,速度提高了大约 500 倍。问题是编译时间太长,抹去所有 GPU 加速,将其转为减速:)
问题是,有没有更快、更有效的方法来做到这一点?我可以重用一些资源,让流程更像流吗?
编辑:每个 PTX 程序只运行一次,而且它们都非常不同,因此 JIT 缓存没有任何好处
这是我的代码,与 nvidia 提供的示例 JIT 应用程序几乎相同:
CHECK_ERROR(cuLinkCreate(6, linker_options, linker_option_vals, &lState));
// Load the PTX from the string myPtx32
CUresult myErr = cuLinkAddData(lState, CU_JIT_INPUT_PTX, (void*) ptxProgram.c_str(), ptxProgram.size()+1, 0, 0, 0, 0);
// Complete the linker step
CHECK_ERROR(cuLinkComplete(lState, &linker_cuOut, &linker_outSize));
// Linker walltime and info_log were requested in options above.
//printf("CUDA Link Completed in %fms. Linker Output:\n%s\n", linker_walltime, linker_info_log);
// Load resulting cuBin into module
CHECK_ERROR(cuModuleLoadData(&hModule, linker_cuOut));
// Locate the kernel entry poin
CHECK_ERROR(cuModuleGetFunction(&hKernel, hModule, "_myBigPTXKernel"));
// Destroy the linker invocation
CHECK_ERROR(cuLinkDestroy(lState));
【问题讨论】:
-
我认为通常的建议是提前编译,将您的 ptx 转换为 cubin。如果您不能提前生成 ptx 子程序,也许您可以安排 ptx-jit 使其在其他内核执行时发生?如果你的内核执行时间很短,那也不是很容易管理,除非你可能会去多线程。