CUDA Cpp并行计算二维和三维网格

NVIDIA 的 CUDA 是一种通用并行计算平台和编程模型,可利用 GPU 的并行处理能力来加速深度学习和其他计算密集型应用程序。CUDA 和 NVIDIA GPU 已被应用于许多需要高浮点计算性能的领域,包括:

  1. 计算金融
  2. 气候、天气和海洋建模
  3. 数据科学和分析
  4. 深度学习和机器学习
  5. 国防和情报
  6. 制造/AEC(建筑、工程和施工):CAD 和 CAE(包括计算流体动力学、计算结构力学、设计和可视化以及电子设计自动化)
  7. 媒体和娱乐(包括动画、建模和渲染;色彩校正和颗粒管理;合成;整理和效果;编辑;编码和数字分发;直播图形;现场、审查和立体工具;以及天气图形)
  8. 医学影像
  9. 油和气
  10. 研究:高等教育和超级计算(包括计算化学和生物学、数值分析、物理学和科学可视化)
  11. 安全保障
  12. 工具和管理

CUDA C++ 并行编程

与任何程序一样,执行必须从 CPU 开始。 我们将创建测试数据,在 CPU(主机)上处理它,计时并将数据传输到 GPU(设备),再次处理并将结果复制回主机。 下面的代码使用 nvcc -std=c 11 cuda_multiply.cu 进行编译,并使用 nvprof 进行分析。

#include <chrono>
#include <iostream>__global__ void _cuda_parallel_multiplication(int count, int* test_data, int magnitude);int main() {int count = 60000000;    // 60 million elementsint* test_data = new int[count];for(int i = 0; i < count; i++)test_data[i] = i;// Perform calculation on host CPUauto t1 = std::chrono::high_resolution_clock::now();for(int i = 0; i < count; i++)test_data[i] = test_data[i] * 5;auto t2 = std::chrono::high_resolution_clock::now();// Copy data to deviceint* d_test_data;cudaMalloc(&d_test_data, count * sizeof(int));cudaMemcpy(d_test_data, test_data, count * sizeof(int), cudaMemcpyHostToDevice);// Copy results back to devicecudaDeviceSynchronize();cudaMemcpy(test_data, d_test_data, count * sizeof(int), cudaMemcpyDeviceToHost);cudaFree(d_test_data);for(int i = 0; i < 10; i++)std::cout << i << ": " << test_data[i] << std::endl;std::cout	<< "CPU time: "<< std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()<< "ms" << std::endl;
}__global__ void _cuda_parallel_multiplication(int count, int* test_data, int magnitude) {int globalIdx = blockIdx.x * blockDim.x + threadIdx.x;while (globalIdx < count) {test_data[globalIdx] = test_data[globalIdx] * magnitude;globalIdx +=  blockDim.x * gridDim.x;__syncthreads();}
}

我们首先生成6000万个整数作为测试数据:

int main() {int count = 60000000;    // 60 million elementsint* test_data = new int[count];
for(int i = 0; i < count; i++)test_data[i] = i;
}

CPU 乘法,用 C++ chrono 计时,#include

auto t1 = std::chrono::high_resolution_clock::now();
for(int i = 0; i < count; i++)test_data[i] = test_data[i] * 5;
auto t2 = std::chrono::high_resolution_clock::now();

为了在GPU上执行计算,必须首先复制数据,CUDA运行时暴露cudaMalloc在GPU上分配内存,并暴露cudaMemcpy来传输数据。

int* d_test_data;
cudaMalloc(&d_test_data, count * sizeof(int));
cudaMemcpy(d_test_data, test_data, count * sizeof(int), cudaMemcpyHostToDevice);

CUDA 并行模型

从串行 CUDA 计算到并行 CUDA 计算的变化涉及硬件和软件的变化。 硬件变化涉及包含多个计算单元以及用于调度计算和数据传输的机制的芯片。 软件更改涉及 API 和编程语言的扩展。

GPU 实现并行化的最重要属性是该设备包含的不是一个或多个计算单元(如现代多核 CPU),而是数百或数千个计算单元。 如果您可以将计算组织为大量独立的子任务,那么众多的计算单元使您能够并行执行其中许多任务; 也就是说,同时执行任务而不是顺序执行任务。 实现这种并行化涉及一些主要的组织问题:特定的计算单元如何知道要执行哪个子任务? 大量计算单元如何访问它们所需的指令和数据而不造成严重的通信流量拥堵?

CUDA 采用单指令多线程 (SIMT) 并行化模型。 CUDA GPU 包含许多称为核心的基本计算单元,每个核心都包含算术逻辑单元 (ALU) 和浮点单元 (FPU)。 核心被分为称为流式多处理器 (SM) 的组。

我们通过将计算任务分解为许多称为线程的子任务来并行化计算任务,这些子任务被组织成块。 块被划分为 warp,其大小与 SM 中的核心数量相匹配。 每个扭曲被分配给一个特定的 SM 来执行。 SM 的控制单元指示其每个核心为分配的 warp 中的每个线程同时执行相同的指令,因此称为“单指令多线程”。

执行相同的指令不仅仅是一种冗余练习,因为每个线程使用 CUDA提供的唯一索引值执行不同的计算。 SIMT 方法具有可扩展性,因为可以通过提供更多 SM 来分担计算负载来提高计算吞吐量。CPU 和 GPU 架构之间的对比, CPU 有几个计算核心,占据芯片的一小部分,并有很大的区域专门用于控制和缓存,以帮助这几个核心快速运行。 一般规则是,访问数据所需的时间随着计算核心与存储数据的内存位置之间的距离的增加而增加。 内核等待数据的时间称为延迟,CPU 的设计目的是通过专用大量空间来存储可以快速访问的数据来最大程度地减少延迟。

GPU上的空间分配有很大不同。 大部分芯片区域专用于组织成具有共享控制单元的 SM 的大量计算核心。 GPU 的目标不是最小化延迟(这需要每个核心大量的缓存),而是隐藏延迟。 当执行一个warp需要不可用的数据时,SM切换到执行另一个数据可用的warp。 重点是整体计算吞吐量,而不是单个核心的速度。

并行计算示例

计算矩阵距离

计算二维网格动态稳定性

计算一维网格上的导数

计算平衡温度分布控制势场的拉普拉斯方程解

计算图像质心

计算和可视化三维数据网格(图像堆栈)

参阅一:亚图跨际
参阅二:亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flask基于python的个人理财备忘录记账提醒系统vue

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。 “备忘记账系统”是基于Mysql数据库&#xff0c;在python程序设计的基础上实现的。为确保中国经济的持续发展&#xff0c;信息时代日益更新&#xff0c;蓬勃发展。同时&#xff0c;随着信息社…

【Java之css】

CSS CSS的引入方式 方式一&#xff1a;直接在html的标签上加入style属性&#xff0c;多个样式用分号分割 方式二&#xff1a;写在Head标签里面&#xff0c;用一个style标签包裹&#xff08;当下的主流&#xff09; 方式三&#xff1a;用链接导入外部的文件 CSS的选择器 标签…

【智能家居入门2】(MQTT协议、微信小程序、STM32、ONENET云平台)

此篇智能家居入门与前两篇类似&#xff0c;但是是使用MQTT协议接入ONENET云平台&#xff0c;实现微信小程序与下位机的通信&#xff0c;这里相较于使用http协议的那两篇博客&#xff0c;在主程序中添加了独立看门狗防止程序卡死和服务器掉线问题。后续还有使用MQTT协议连接MQTT…

输入和输出

按字符输入输出 按字符输出putchar&#xff08;&#xff09; 格式 #include <stdio.h> int putchar(int c); 功能&#xff1a;向终端输出一个字符 参数&#xff1a;要输出的字符的ASCII码值 返回值&#xff1a; 成功&#xff0c;返回输出字符的ASCII码值 失败&#xff…

基于springboot汽车租赁系统源码和论文

首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包括软件架构模式、整体功能模块、数据库设计。本项…

Missing or invalid credentials.(Git push报错解决方案)

前言 本文主要讲解git push后报错Missing or invalid credentials的解决方案。这里针对的是windows的。 编程环境&#xff1a;VsCode 问题原因 问题翻译起来就是 凭据缺失或无效。这里我们解决方案是取消vscode里面默认的控制终端git凭据来解决,具体方案如下. 解决方案 1…

3D效果图加树进去太卡,渲染太慢怎么办?

周末的时候&#xff0c;有个朋友私信来问&#xff1a;3dmax模型加树进去打开时特别的卡&#xff0c;是怎么回事。 不知道有没有朋友遇上这么个情况。 3dmax加树建议就用代理&#xff0c;这样相比于直接加而言&#xff0c;会流畅许多。 在3D效果图中&#xff0c;“树代理”是…

萝卜视频源码前后端带视频演示

萝卜影视源码前端是用JAVA开发的全原生APP源码&#xff0c;后端用的是二次开发的苹果CMS&#xff0c;支持局域网投屏&#xff0c;视频软解硬解&#xff0c;播放器自带弹幕功能。支持解析官方视频&#xff0c;支持M3U8&#xff0c;MP4。 开屏广告&#xff0c;全局广告&#xff0…

GitHub国内打不开(解决办法有效)

最近国内访问github.com经常打不开&#xff0c;无法访问。 github网站打不开的解决方法 1.打开网站http://tool.chinaz.com/dns/ &#xff0c;在A类型的查询中输入 github.com&#xff0c;找出最快的IP地址。 2.修改hosts文件。 在hosts文件中添加&#xff1a; # localhost n…

从0开始搭建若依微服务项目 RuoYi-Cloud(保姆式教程完结)

文章接上一章&#xff1a; 从0开始搭建若依微服务项目 RuoYi-Cloud&#xff08;保姆式教程 一&#xff09;-CSDN博客 四. 项目配置与启动 当上面环境全部准备好之后&#xff0c;接下来就是项目配置。需要将项目相关配置修改成当前相关环境。 数据库配置 新建数据库&#xff…

element ui组件 el-date-picker设置default-time的默认时间

default-time &#xff1a;选择日期后的默认时间值。 如未指定则默认时间值为 00:00:00 默认值修改 <el-form-item label"计划开始时间" style"width: 100%;" prop"planStartTime"><el-date-picker v-model"formData.planStart…

TortoiseSVN各版本汉化包下载

首先进入下载版本列表 1.下载地址&#xff1a;https://sourceforge.net/projects/tortoisesvn/files ​ 2.选择自己版本进入​ 3.选择Language Packs进入&#xff0c;选择对应语言包下载。 ​ 4.在TortoiseSVN根目录下点击安装即可。 ​

解密数据清洗,SQL中的数据分析

大家好&#xff0c;数据库表中的数据经常会很杂乱。数据可能包含缺失值、重复记录、异常值、不一致的数据输入等&#xff0c;在使用SQL进行分析之前清洗数据是非常重要的。 当学习SQL时&#xff0c;可以随意地创建数据库表&#xff0c;更改它们&#xff0c;根据需要更新和删除…

canvas测量文字长度(measureText)

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

数据结构——栈和队列(C语言)

栈种常见的数据结构&#xff0c;它用来解决一些数据类型的问题&#xff0c;那么好&#xff0c;我来带着大家来学习一下栈 文章目录 栈对栈的认识栈的模拟实现栈的练习方法一方法二 栈 对栈的认识 栈&#xff08;stack&#xff09;是限定只能在表的一端进行插入删除操作的线性…

vue 模板语法值class操作

class.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>class</title><!-- 确保引入正确的Vue版本库&#xff0c;下面只是示例&#xff0c;需要替换为实际可工作的CDN地址 --><sc…

低代码核心思想:插件化开发(vue3实现)

我们在开发一些组件插件的时候&#xff0c;需要动态的从外部去注入第三方插件 1. 如何做一个插件化的项目&#xff0c;模拟代码如下 // 插件设计内容 // 1. 插件底座 // 2. 插件注册方式 // 3. 调用插件 class Calculator{// 插件底座plugins []constructor(){}// 注册use(p…

SpringCloud LoadBalancer

SpringCloud LoadBalancer 1.什么是LoadBalancer LoadBalancer&#xff08;负载均衡器&#xff09;是一种网络设备或软件机制&#xff0c;用于分发传入的网络流量负载请求到多个后端目标服务器上&#xff0c;从而实现系统资源的均衡利用和提高系统的可用性和性能。 负载均衡器…

(Rust)LeetCode 热题 100-两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

【Tomcat与网络4】Tomcat的连接器设计

目录 1 如何设计一个灵活可靠的连接器 2 主要组件介绍 在上一篇&#xff0c;我们介绍了Tomcat提供服务的整体结构&#xff0c;本文我们一起来看一下Tomcat的连接器的设计。 在前面我们提到Tomcat主要完成两个功能&#xff1a; 处理 Socket 连接&#xff0c;负责网络字节流与…