我正在编写 CUDA 代码,在 VS2022 中使用 nvcc 进行编译,生成 PTX 文件,然后从 Embarcadero Delphi 运行 CUDA 代码。为了从 Delphi 运行 CUDA 内核,我编写了一个 nvcuda.dll 的 API,它运行得很好。例如,我使用 cuInit、cuMemAlloc、cuLaunchKernel、cuMemcpyDtoH_v2、cuMemcpyHtoD_v2 等函数没有任何问题,所有这些都根据 CUDA Runtime API。
但是,我一直无法在nvcuda.dll(或libcuda.so)中找到cudaDeviceSynchronize()。虽然cudaDeviceSynchronize()存在于大多数由nvcc编译的CUDA演示程序中,但它似乎不存在于DLL中。
如何让CPU使用API(即不是nvcc编译的C程序)等待CUDA内核?
...使用
、cuInit
、cuMemAlloc
、cuLaunchKernel
、cuMemcpyDtoH_v2
等函数没有任何问题,全部根据 CUDA Runtime APIcuMemcpyHtoD_v2
这些不是运行时 API 函数,而是驱动程序 API 函数。你之所以在 NVCUDA.DLL 中找到它们,是因为该库是 Windows 上的驱动程序 API 提供者。
你找不到
CudaDeviceSynchronize
的原因是因为它是一个运行时API函数。如果您实际上使用驱动程序 API,则等效函数将是 cuCtxSynchronize
。