如何检索CUDA 4.0+;内核 根据英伟达文档,CUDA 3.2 +编译的内核包含有关参数列表的信息。有没有一种方法可以通过编程方式从CUF函数句柄检索此信息?我需要从内核的函数句柄中知道参数的数量和每个参数的大小(以字节为单位)。我已经看过上面提到的NVidia文档,其中说明了此信息的存在,但我还没有看到CUDA文档中的任何地方指出访问此信息的编程方式

如何检索CUDA 4.0+;内核 根据英伟达文档,CUDA 3.2 +编译的内核包含有关参数列表的信息。有没有一种方法可以通过编程方式从CUF函数句柄检索此信息?我需要从内核的函数句柄中知道参数的数量和每个参数的大小(以字节为单位)。我已经看过上面提到的NVidia文档,其中说明了此信息的存在,但我还没有看到CUDA文档中的任何地方指出访问此信息的编程方式,cuda,Cuda,再补充一点说明:我正在使用一个中间件系统。它的前端库取代了目标系统上的libcuda(驱动程序API库)。然后,后端在另一台使用GPGPU资源的主机上作为守护进程运行,并调用该机器上的真实libcuda。还有其他中间件解决方案已经在内核中实现了这一点,所以这是完全可能的。此外,CUDA本身使用这些信息来了解如何从传递到内核的指针解析参数 编辑:我最初有一个CUDA版本,在这个版本中,元数据被错误地列出。根据的说法,它是3.2,而不是4.0。内核旨在启动您知道其函数原型的内核。没有用于“反向工程”

再补充一点说明:我正在使用一个中间件系统。它的前端库取代了目标系统上的libcuda(驱动程序API库)。然后,后端在另一台使用GPGPU资源的主机上作为守护进程运行,并调用该机器上的真实libcuda。还有其他中间件解决方案已经在内核中实现了这一点,所以这是完全可能的。此外,CUDA本身使用这些信息来了解如何从传递到内核的指针解析参数


编辑:我最初有一个CUDA版本,在这个版本中,元数据被错误地列出。根据

的说法,它是3.2,而不是4.0。内核
旨在启动您知道其函数原型的内核。没有用于“反向工程”功能原型的API

我正在处理同一个问题(我不知道你是否解决了它)。 我正在使用一个已知的内核来研究函数指向内存是如何使用的。 这是无参数版本:

#include<cstdio>

extern "C" {
    __global__ void HelloWorld(){
        int thid = (blockIdx.x * blockDim.x) + threadIdx.x;
    }
}
#包括
外部“C”{
__全局\uuuuvoid HelloWorld(){
intthid=(blockIdx.x*blockDim.x)+threadIdx.x;
}
}
这是单参数版本,以此类推

#include<cstdio>

extern "C" {
    __global__ void HelloWorld(int a) {
        int thid = (blockIdx.x * blockDim.x) + threadIdx.x;
    }
}
#包括
外部“C”{
__全局无效HelloWorld(int a){
intthid=(blockIdx.x*blockDim.x)+threadIdx.x;
}
}

我建议您转储CUF函数所指向的内存的前1024字节,并按照指针操作。例如,在0x30偏移量处,有一个指针指向指针表。我注意到CUfunction发布的结构的大小不会随着函数参数的数量而改变,因此我们要查找的表必须按照指针进行查找。

CUfunction是内核,前缀为global。您需要函数参数的大小吗?如果你有内核,你可以找到它。是的,我需要它的参数的大小。我没有内核的源码,只是它的句柄(可能是从C++调用CuMeMeGeType函数的函数返回的)。具体来说,我需要参数的数量和每个论证的大小。应该可以从设备ELF有效负载的符号以fatbinary或cubin的形式对损坏的符号名进行反向工程。但是如果内核是用C链接编译的,那就不起作用了…哈哈,是的,不幸的是,我不能假设C++链接被使用。根据内核的文档,参数的数量和类型存储为使用CUDA 4.0+编译的任何内核的元数据,但我还没有看到任何用于访问此信息的公共API。不过,元数据就是culunchkernel本身解析参数的方式,而且我知道其他中间件确实支持culunchkernel,因此必须有某种方法来实现它。我希望有比自己解析cubin更好的东西,但归根结底可能就是这样。我相信驱动程序API使用元数据来简化启动内核的API——旧方法要求对每个内核参数调用API。目的不是使元数据可用,而是使API更易于使用。为什么你说其他中间件的存在意味着元数据必须可用?是的,我知道为什么会做出更改。我之所以说这些数据必须以某种方式(不一定通过公共API)可用,是因为中间件不可能在不知道这些参数的大小的情况下拦截culanchkernel()函数并将其参数正确地传递给另一台机器(据我所知,中间件是这样做的)。这也是我正在做的。我正在使用一个库来替换目标机器上的libcuda,并将参数数据传递到另一台机器,然后将其传递到真正的libcuda函数中。对不起,应该是“number and size”,而不是“number of size”