有没有一种方法可以将针对不同计算能力的设备的代码混合在一个DLL中?

有没有一种方法可以将针对不同计算能力的设备的代码混合在一个DLL中?,dll,cuda,gpu,nvidia,Dll,Cuda,Gpu,Nvidia,例如,如果我编写一个CUDA库,则有些函数使用了一些独占的SM 3.X特性(例如,shuffle intrinsic) 而其他功能仅使用SM 2.X功能 我想把所有这些库函数编译成一个DLL,让DLL在运行时选择合适的函数,这在CUDA中可能吗 比如: 使用DLL中的入口函数,根据硬件功能测试,启动合适的内核/例程。如果您有相同的入口点(例如,内核名称、启动参数、参数相同),则可以依赖预编译器(来自GrabCuda SDK示例): #if uuu CUDA uuu ARCH_uuu

例如,如果我编写一个CUDA库,则有些函数使用了一些独占的SM 3.X特性(例如,shuffle intrinsic)

而其他功能仅使用SM 2.X功能

我想把所有这些库函数编译成一个DLL,让DLL在运行时选择合适的函数,这在CUDA中可能吗

比如:


使用DLL中的入口函数,根据硬件功能测试,启动合适的内核/例程。

如果您有相同的入口点(例如,内核名称、启动参数、参数相同),则可以依赖预编译器(来自GrabCuda SDK示例):

#if uuu CUDA uuu ARCH_uuu<200
无符号整数gmm_标志_bvec=0;
对于(int i=0;i 0)
{
gmm_flags_bvec |=10);
#恩迪夫
然后,您必须将几个-gencode参数传递给NVCC-它将构建不同的内核并将它们包含在您的可执行文件中。当应用程序运行时,驱动程序将自动为您的设备选择合适的内核

然后,如果您的主机代码在不同的设备体系结构之间存在差异(例如,如果设备非常旧,您在设备上执行的操作会更少)您可以为不同的计算功能创建多个CU,并让每个CU文件导出作为入口点的主机功能。根据可用硬件,您的应用程序负责使用适当的入口点

例如,您的应用程序_logic_sm3x.cu包含使用SM 3.x功能的内核和一个名为compute_sm3x(…)的常规C函数。应用程序_logic_sm2x.cu将使用SM 2.x功能和一个名为compute_sm2x(…)的包含C函数

main.cpp函数将使用CUDAGetDeviceProperty,然后根据可用硬件调用compute_sm3x或compute_sm2x


<强> Update <强>您可以从CUDA工具包5查看SimulePrimTf示例——它对于1 x和2 x x和NeXER有稍微不同的代码路径。

在某种程度上,CUDA FATBIN模型已经具备了这个特性。您可以用简单的用例来扩展您的问题吗?编译成许多特定于体系结构的版本的特定函数,或者只是特定于体系结构的不同函数的集合?@talonmies:只是针对不同体系结构的不同函数(静态)的集合。
static __global__ void Kernel_SM2x(void)
//...
static __global__ void Kernel_SM3x(void)
//...
#if __CUDA_ARCH__ < 200
        unsigned int gmm_flags_bvec = 0;
        for (int i=0; i<32; ++i)
        {
            if (gmm_flags[i] > 0)
            {
                gmm_flags_bvec |= 1 << i;
            }
        }
        tile_gmms[blockIdx.y * gridDim.x + blockIdx.x] = gmm_flags_bvec;
#else
        tile_gmms[blockIdx.y * gridDim.x + blockIdx.x] = __ballot(gmm_flags[threadIdx.x] > 0);
#endif