c++ - 重载 cuda 核函数
问题描述
在 CUDA 中使用重载的内核函数时遇到了问题。
我可以理解 CUDA 可以通过其参数启动重载函数。
但是,如果我想cudaOccupancyMaxPotentialBlockSize()
用来计算最大占用的块大小,请参阅doc。
__global__ void foo_cuda_kernel(int a)
{
/*implementation 1*/
}
//overloaded kernel function
__global__ void foo_cuda_kernel(int a, int b)
{
/*implementation 2*/
}
void foo_cuda()
{
int min_grid_size, grid_size, block_size;
cudaOccupancyMaxPotentialBlockSize
(
&min_grid_size, &block_size,
foo_cuda_kernel, //how does it distinguish overloaded functions?
0, thread_num
);
grid_size = (thread_num + block_size - 1) / block_size;
//I can understand compiler can distinguish the launched function by its arguments
foo_cuda_kernel<<<grid_size, block_size>>>((int)1);
cudaDeviceSynchronize();
}
如何使它起作用?如何cudaOccupancyMaxPotentialBlockSize()
区分重载函数?
解决方案
如注释中所述,您可以将函数转换为指向正确专业化的指针:
auto foo_ii = static_cast<void (*)(int, int)>(&foo_cuda_kernel);
auto foo_i = static_cast<void (*)(int)>(&foo_cuda_kernel);
然后,根据您需要的函数版本,将foo_i
或传递foo_ii
给。cudaOccupancyMaxPotentialBlockSize
这将起作用,因为工具链静默发出主机样板函数,这些函数包装底层运行时 API 调用以运行内核并强制内核参数类型检查。宿主编译器将这些包装器视为任何其他宿主函数(因为它们是),并自动选择匹配的版本。
推荐阅读
- flutter - 为移动和桌面构建 Flutter 应用程序
- key - 按下其他 Windows 程序上的按钮
- php - URL 被附加到前一个 URL(旧版本的 Laravel)
- angular - 如何在滑动切换角度 2(材料 - 工具栏)中调用方法?
- java - 在 Kubernetes 上部署 docker 镜像有哪些 Java API 选项?
- python - 如何将 2 个工作表单添加到同一个模板?
- c++ - 动态改变队列数组的大小
- php - 没有 AppEngine 的 Google 云存储上的 PHP 文件
- wordpress - 如何正确映射来自 Woocommerce 和 Quickbooks 的两个现有项目数据?
- react-native - 为什么 React Navigation 事件“willFocus”没有执行?