有没有一种方法可以将针对不同计算能力的设备的代码混合在一个DLL中?
例如,如果我编写一个CUDA库,则有些函数使用了一些独占的SM 3.X特性(例如,shuffle intrinsic) 而其他功能仅使用SM 2.X功能 我想把所有这些库函数编译成一个DLL,让DLL在运行时选择合适的函数,这在CUDA中可能吗 比如:有没有一种方法可以将针对不同计算能力的设备的代码混合在一个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
使用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