从Python代码将Lambda传递到CUDA内核的最佳方法

问题描述

这将是一个悬而未决的问题,但我希望有人可能知道如何解决我的问题。

我有使用pybind11编译的C ++库,允许我从python调用某些函数。 C ++库使用C​​UDA在设备上执行某些操作。

我需要允许用户(只能访问python,而不能进入C ++或CUDA代码)定义将在CUDA内核之一中运行的操作(通常为lambda)。

如果您对我在哪里可以学到正确的方法有什么建议,我将不胜感激!

解决方法

我想不出任何办法。进行此类工作的障碍

  • PyBind样式绑定不适用于CUDA设备功能
  • 虽然CUDA支持将C ++ lambda函数传递给内核,但它是静态编译器生成的支持。我没有办法在没有编译器调用的情况下将lambda函数带入内核调用(可能是nvcc而不是nvrtc,这意味着在运行时会纠缠于编译器,或者侵入PyCUDA的扩展)。所有这些都会违反您的“无法进入C ++或CUDA代码”标准。
  • 类似地,您将需要应用程序中的CUDA运行时链接支持。我也很确定,链接器无法链接裸lambda函数,只能链接具有通用接口(try { $dynamicFoo(...$args); } catch (UnknownNamedParameterError $error) { // if needed,a check to confirm the error happened in foo if (($error->getTrace()[0]["function"] ?? null) === $dynamicFoo) { // Hacky but whatever } } )的设备函数,因此您需要发出内核,包装程序和CUDA C ++设备lambda,然后对其进行编译。 ,并将其链接。这需要CUDA驱动程序API,我确定您没有使用。

您最大的希望就是尝试Numba,它可以在运行时编译Python设备函数。但是,它没有处理lambda函数的任何能力,并且不能与C ++代码静态交互或无法与CUDA工具链编译的JIT交互。您可能被迫在Python中重新实现许多CUDA C ++代码以使其正常工作,并且Numba内核方言缺少现代CUDA功能的 lot ,这可能会变得非常困难,具体取决于复杂程度您现有的CUDA代码是。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...