从python代码向CUDA内核传递lambda的最佳方法

从python代码向CUDA内核传递lambda的最佳方法,python,c++,lambda,cuda,Python,C++,Lambda,Cuda,这将是一个开放的问题,但我希望有人可能知道如何解决我的问题 我用PybDun11编译了C++库,允许我从Python调用一些函数。C++库使用CUDA对设备执行一些操作。 我需要允许用户(只有访问Python,不能进入C++或CUDA代码)来定义一个操作(通常是lambda),它将运行在一个CUDA内核中。 如果你能给我一些建议,告诉我在哪里可以学到正确的方法,我将非常感激 我想不出任何办法来做这件事。这类工作的障碍 PyBind样式绑定不能与CUDA设备函数一起使用 虽然CUDA支持C++

这将是一个开放的问题,但我希望有人可能知道如何解决我的问题

我用PybDun11编译了C++库,允许我从Python调用一些函数。C++库使用CUDA对设备执行一些操作。

我需要允许用户(只有访问Python,不能进入C++或CUDA代码)来定义一个操作(通常是lambda),它将运行在一个CUDA内核中。


如果你能给我一些建议,告诉我在哪里可以学到正确的方法,我将非常感激

我想不出任何办法来做这件事。这类工作的障碍

  • PyBind样式绑定不能与CUDA设备函数一起使用
  • 虽然CUDA支持C++ lambda函数传递给内核,但它是静态编译器生成的支持。据我所知,没有编译器调用就无法将lambda函数引入内核调用(可能是nvcc,而不是nvrtc,这意味着在运行时会大量使用编译器,或者对PyCUDA的扩展进行黑客攻击)。所有这些都会违反你的“不能进入C++或CUDA代码”的标准。
  • 同样,在应用程序中也需要CUDA运行时链接支持。我也很确定链接器不能链接裸lambda函数,只有设备函数与通用接口(<代码> NVSTD::Fuff< /Cord>),所以您需要发出内核、包装器和CUDA C++设备lambda,编译它们,并链接它们。这需要CUDA驱动程序API,我确信您没有使用该API

您最大的希望是尝试Numba,它允许运行时编译Python设备函数。然而,它缺乏处理lambda函数的能力,不能静态地与C++代码交互,或者不能用CUDA工具链编译JIT。您可能不得不在Python中重新实现大量的CUDA C++代码来实现这一工作,而NUBA内核的方言缺少很多现代CUDA特性,这可能会使您的CUDA代码复杂化,这将非常困难。

< P>我想不出有什么办法来实现这一点。这类工作的障碍

  • PyBind样式绑定不能与CUDA设备函数一起使用
  • 虽然CUDA支持C++ lambda函数传递给内核,但它是静态编译器生成的支持。据我所知,没有编译器调用就无法将lambda函数引入内核调用(可能是nvcc,而不是nvrtc,这意味着在运行时会大量使用编译器,或者对PyCUDA的扩展进行黑客攻击)。所有这些都会违反你的“不能进入C++或CUDA代码”的标准。
  • 同样,在应用程序中也需要CUDA运行时链接支持。我也很确定链接器不能链接裸lambda函数,只有设备函数与通用接口(<代码> NVSTD::Fuff< /Cord>),所以您需要发出内核、包装器和CUDA C++设备lambda,编译它们,并链接它们。这需要CUDA驱动程序API,我确信您没有使用该API

您最大的希望是尝试Numba,它允许运行时编译Python设备函数。然而,它缺乏处理lambda函数的能力,不能静态地与C++代码交互,或者不能用CUDA工具链编译JIT。您可能不得不在Python中重新实现大量CUDA C++代码,以使其工作,而NUBA内核的方言缺少大量的现代CUDA特性,这可能会让这变得非常困难,这取决于你现有的CUDA代码有多复杂。

@greg-449:这是一个完全不相关的问题duplicate@greg-449:那是完全不相干的复制品