当前位置: 首页 > news >正文

CUDA核函数,如何设置grid和block即不超过大小又能够遍历整个volume

此问题答案来自于openAI

1、Grid 大小: Grid 的大小由 dim3 grid 定义,其三个分量分别表示在 x、y、z 方向上的 Grid 数量。Grid 的大小不应该超过 GPU 的最大 Grid 大小。cudaDeviceGetAttribute获取限制。

int maxGridSizeX, maxGridSizeY, maxGridSizeZ;
cudaDeviceGetAttribute(&maxGridSizeX, cudaDevAttrMaxGridSizeX, 0);
cudaDeviceGetAttribute(&maxGridSizeY, cudaDevAttrMaxGridSizeY, 0);
cudaDeviceGetAttribute(&maxGridSizeZ, cudaDevAttrMaxGridSizeZ, 0);

2、Block 大小: Block 的大小由 dim3 block 定义,其三个分量表示在 x、y、z 方向上的线程数量。Block 的大小不能超过 GPU 支持的最大线程块大小

int maxBlockSize;
cudaDeviceGetAttribute(&maxBlockSize, cudaDevAttrMaxThreadsPerBlock, 0);

3、保证遍历整个体积: 确保 Grid 和 Block 的大小设置能够覆盖整个体积。

#include <iostream>const int volume_size_x = 512;
const int volume_size_y = 512;
const int volume_size_z = 512;int main() {int maxGridSizeX, maxGridSizeY, maxGridSizeZ;int maxBlockSize;cudaDeviceGetAttribute(&maxGridSizeX, cudaDevAttrMaxGridSizeX, 0);cudaDeviceGetAttribute(&maxGridSizeY, cudaDevAttrMaxGridSizeY, 0);cudaDeviceGetAttribute(&maxGridSizeZ, cudaDevAttrMaxGridSizeZ, 0);cudaDeviceGetAttribute(&maxBlockSize, cudaDevAttrMaxThreadsPerBlock, 0);// 希望的 Block 大小dim3 block(8, 8, 8);// 计算 Grid 的大小dim3 grid(std::min((volume_size_x + block.x - 1) / block.x, maxGridSizeX),std::min((volume_size_y + block.y - 1) / block.y, maxGridSizeY),std::min((volume_size_z + block.z - 1) / block.z, maxGridSizeZ));// 输出 Grid 和 Block 大小std::cout << "Grid Size: (" << grid.x << ", " << grid.y << ", " << grid.z << ")\n";std::cout << "Block Size: (" << block.x << ", " << block.y << ", " << block.z << ")\n";return 0;
}

3、如果最大的 Grid 和 Block 依然不能覆盖整个体积,你可以通过多次调用核函数,每次处理部分数据,以覆盖整个体积。在这种情况下,你可以将体积分成块。

http://www.lryc.cn/news/238223.html

相关文章:

  • 【Linux】软连接和硬链接:创建、管理和解除链接的操作
  • Matlab群体智能优化算法之海象优化算法(WO)
  • go语言学习-结构体
  • Stable Diffusion进阶玩法说明
  • PDF控件Spire.PDF for .NET【转换】演示:将PDF 转换为 HTML
  • 二分查找——34. 在排序数组中查找元素的第一个和最后一个位置
  • MFC中的主窗口以及如何通过代码找到主窗口
  • Typora下载安装 (Mac和Windows)图文详解
  • 32位单片机PY32F040,主频72M,外设丰富,支持断码LCD
  • Shell判断:模式匹配:case(二)
  • 从android.graphics.Path中取出Point点,Kotlin
  • 力扣C++学习笔记——C++ 给vector去重
  • Flutter笔记:使用相机
  • 包装类型的缓存机制
  • 【BUG】第一次创建vue3+vite项目启动报错Error: Cannot find module ‘worker_threads‘
  • 多目标应用:基于非支配排序的鲸鱼优化算法NSWOA求解微电网多目标优化调度(MATLAB代码)
  • 网络爬虫|Selenium——find_element_by_xpath()的几种方法
  • 【Kingbase FlySync】命令模式:部署双轨并行,并实现切换同步
  • echarts 多toolti同时触发图表实现
  • 2023.11.22使用flask做一个简单的图片浏览器
  • 万字解析设计模式之桥接模式、外观模式
  • 常用系统函数
  • 键盘控制ROS车运动
  • linux上交叉编译qt库
  • Nacos介绍与使用
  • 网工内推 | 字节原厂,正式编,网络工程师,最高30K*15薪
  • Git 远程仓库(Github)
  • Mybatis Plus分页实现逻辑整理(结合芋道整合进行解析)
  • C#编程题分享(2)
  • Dockerfile基础