Cuda 基于Cmake创建Cuda项目

news2024/11/16 0:52:56

文章目录

  • 一、简介
    • 1.1GPU的优势
    • 1.2 CUDA®:通用并行计算平台和编程模型
  • 二、Cuda项目
  • 三、实现效果
  • 参考资料

一、简介

1.1GPU的优势

图形处理单元(GPU)1在相同的价格和功率范围内提供比CPU高得多的指令吞吐量和内存带宽。许多应用程序利用这些更高的功能在GPU上比在CPU上运行得更快(参见GPU应用程序)。其他计算设备,如fpga,也非常节能,但提供的编程灵活性远不如gpu。

GPU和CPU之间的这种能力差异的存在是因为它们在设计时考虑了不同的目标。CPU被设计成擅长于尽可能快地执行一系列被称为线程的操作,并且可以并行执行几十个线程,而GPU被设计成擅长于并行执行数千个线程(摊销较慢的单线程性能以获得更大的吞吐量)。

GPU专门用于高度并行计算,因此设计了更多的晶体管用于数据处理,而不是数据缓存和流控制。下图显示了CPU与GPU的芯片资源分布示例。

1.2 CUDA®:通用并行计算平台和编程模型

2006年11月,NVIDIA®推出了CUDA®,这是一种通用的并行计算平台和编程模型,利用NVIDIA gpu中的并行计算引擎,以比CPU更有效的方式解决许多复杂的计算问题。

CUDA附带了一个软件环境,允许开发人员使用c++作为高级编程语言。如图2所示,支持其他语言、应用程序编程接口或基于指令的方法,例如FORTRAN、DirectCompute、OpenACC。

二、Cuda项目

1、首先创建CMakeList文件,使用CMake软件生成VS项目(需要提前安装好Cuda库)。

CMakeLists.txt

cmake_minimum_required(VERSION 3.19 FATAL_ERROR)
project(CudaTest LANGUAGES CUDA CXX)

set(CMAKE_CXX_STANDARD 14)
set(CUDA_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN TRUE)
set(CMAKE_POSITION_INDEPENDENT_CODE TRUE)
set(CMAKE_CUDA_ARCHITECTURES "60;61;62;70;72;75;80;86;87")
set(CMAKE_CUDA_SEPARABLE_COMPILATION TRUE)
set(CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS TRUE)
set(CMAKE_CUDA_HOST_COMPILATION_CPP FALSE)
set(CMAKE_CUDA_PROPAGATE_HOST_FLAGS FALSE)

# CUDA
find_package(CUDAToolkit REQUIRED)

file( GLOB header_list *.h  )
file( GLOB source_list *.hpp *.cpp *.cu)

add_executable(${PROJECT_NAME} ${header_list})
target_sources(${PROJECT_NAME} PRIVATE ${source_list})

target_link_libraries(${PROJECT_NAME}
        PRIVATE
        CUDA::cusparse
		CUDA::cusolver)

2、举个例子

main.cu

#include <iostream>
#include <cuda_runtime.h>

// CUDA 核函数:执行向量加法
__global__ void vectorAdd(float* A, float* B, float* C, int N) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    if (i < N) {
        C[i] = A[i] + B[i];
    }
}

int main() {
    int N = 1000;  // 向量大小
    size_t size = N * sizeof(float);

    // 分配CPU内存
    float* h_A = (float*)malloc(size);
    float* h_B = (float*)malloc(size);
    float* h_C = (float*)malloc(size);

    // 初始化向量A和B
    for (int i = 0; i < N; ++i) {
        h_A[i] = static_cast<float>(i);
        h_B[i] = static_cast<float>(i * 2);
    }

    // 分配GPU内存
    float* d_A, * d_B, * d_C;
    cudaMalloc((void**)&d_A, size);
    cudaMalloc((void**)&d_B, size);
    cudaMalloc((void**)&d_C, size);

    // 将数据从CPU传输到GPU
    cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);

    // 指定线程块大小和网格大小
    int blockSize = 256;
    int gridSize = (N + blockSize - 1) / blockSize;

    // 启动CUDA核函数
    vectorAdd<<<gridSize, blockSize >>> (d_A, d_B, d_C, N);

    // 将结果从GPU传输回CPU
    cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);

    // 打印结果的一部分以验证
    for (int i = 0; i < 10; ++i) {
        std::cout << "C[" << i << "] = " << h_C[i] << std::endl;
    }

    // 释放GPU内存
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    // 释放CPU内存
    free(h_A);
    free(h_B);
    free(h_C);

    system("pause");
    return 0;
}

三、实现效果

参考资料

[1]https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html

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

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

相关文章

ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(7)

接前一篇文章:ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(6) 上一回说到笔者分析base_poll_write函数中的select()返回的结果可能并不是超时而是负值,并且在base_poll_write函数中添加了打印,如下所示: 当时想着是更新固件并烧录之后…

学习笔记 韩顺平 零基础30天学会Java(2024.8.20)

P522 HashSet源码解读1 P523 HashSet源码解读2 开发技巧&#xff1a;在需要辅助变量或局部变量的时候再创建 P524 HashSet源码解读3 当单链表超过8个&#xff0c;但是还可以扩容的时候&#xff0c;将会把整条链表放到扩容后的最后应该位置上&#xff08;由老师讲解的16到32引起…

Windows SDK(八)模态对话框与非模态对话框

对话框的创建 对话框分为模态对话框和非模态对话框两种形式 模态对话框&#xff1a;自建消息循环&#xff0c;并且通过EnableWindow禁用了父窗口的键盘鼠标输入达到阻塞父窗口的功能。当有对话框&#xff0c;父窗口阻塞时&#xff0c;透过对话框是无法对父窗口进行操作的&…

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布&#xff0c;2.0版本迎来第一个稳定版本&#xff0c;同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架&#xff0c;可以让你使用前端技术来构建桌面…

Redis7基础篇(六)

redis复制 目录 redis复制 前引 概念 能干嘛 怎么玩 基本操作 案例演示 前期配置 实操 常用三招 一主二仆 薪火相传 反客为主 复制原理和工作流程 复制的缺点 前引 redis复制这一篇有承上启下的作用 前面的 redis几乎是单机版 一台redis 概念 能干嘛 水平扩容…

收银系统源码-购物卡与会员卡的区别

很多门店都会推出一些只有指定商品才可以使用的购物卡或不同额度、不同折扣的消费卡&#xff0c;用来进行一些商品的促销或会员储值。如今时代实体卡容易丢失&#xff0c;很多人出门不愿意带钱包卡包。如果您有这样的功能需求&#xff0c;快来看看千呼新零售2.0购物卡功能吧&am…

[FSCTF 2023]寻找蛛丝马迹

点一下&#xff0c;看到只有页面背景颜色变化 查看一下页面源码吧&#xff0c;发现第一段flag 访问一下styles.css,看到顶部有一串乱码&#xff08;应该是flag一部分&#xff09;我们用火狐的修复文字编码工具 进行修复后显示 然后再访问script.js,依旧是乱码&#xff0c;同样…

数据湖之Delta Lake

Delta Lake&#xff1a;数据湖存储层概述 Delta Lake 是一种开源的存储层技术&#xff0c;构建在 Apache Spark 的基础之上&#xff0c;旨在解决传统数据湖的可靠性、性能和数据一致性问题。它通过引入 ACID 事务、数据版本控制、时间旅行和统一的批处理与流处理等特性&#x…

【SCI/EI/SCOPUS/CNKI】第三届先进材料与装备制造国际会议(AMEM2024)

会议日期&#xff1a;2024年12月28-30日 会议地点&#xff1a;中国-云南省-昆明市 会议官网&#xff1a;https://www.iaast.cn/meet/home/Bx93wRT 出版检索&#xff1a;EI、Scopus等数据库收录 【主办单位】 国际应用科学与技术协会(IAAST) 【主讲嘉宾】 【论文出版与检…

20 数据可视化

20 数据可视化 本章概述一. `elasticsearch`实现数据统计1.1 创建用户信息索引1.1.1 控制台创建`aggs_user`索引1.1.2 `aggs_user`索引结构初始化1.1.3 创建`aggs_user`索引的`EO`对象1.1.4 用户类型枚举1.1.5 数据初始化****************************************************…

引入本地iconfont图标

iconfont-阿里巴巴图标库官网&#xff0c;搜索想要的图标 1、加入购物车 2、添加至项目 头部的资源管理&#xff0c;点我的项目 找到对应的项目&#xff0c;点击 下载至本地&#xff0c;是个zip压缩包 解压缩一下&#xff0c;copy一下文件&#xff0c;放到项目里&#xff0c;…

打印空心正方形(c语言)

1.//KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“* ”组成的“空心”正方形图案。 //输入描述 : //多组输入&#xff0c;一个整数&#xff08;3~20&#xff09;&#xff0c;表示输出的行数&#xff0c;也表示组成正方形边的“…

PCBlayout什么意思

PCB (Printed Circuit Board) layout 是指在设计印制电路板的过程中&#xff0c;对电子元器件及导电路径进行合理布置的过程。这个过程对于确保电路板的功能性和可靠性至关重要。下面是一些 PCB layout 的基本概念和步骤&#xff1a; 元件放置&#xff1a; 元件放置是 PCB 设计…

AI在线免费数学工具:Qwen2-Math

1、Qwen2-Math https://huggingface.co/spaces/Qwen/Qwen2-Math-Demo

python中使用gurobi遇到强不等式约束(只有大于或者小于而不是大于等于或者小于等于的形式)的解决办法

文章目录 情况分析与解决思路数学模型严格不等式约束转化后的约束形式带入具体的 ϵ \epsilon ϵ 值 python代码总结 情况分析与解决思路 在gurobi求解数学优化问题时&#xff0c;标准的约束形式通常是大于等于&#xff08; >&#xff09;或小于等于&#xff08;<&…

nginx简介及功能介绍

目录 niginx与apache niginx特点 nginx模块介绍 nginx的编译安装 nginx的平滑升级及版本回滚 niginx的常用参数 nginx独立文件编写 location匹配用法 自定义日志 文件检测 nginx中的长链接管理 nginx下载服务器设置 nginx的状态页面 nginx的数据压缩功能 nginx的…

客车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

制造业正经历着前所未有的变革&#xff0c;其中客车制造行业作为传统制造业的重要组成部分&#xff0c;正积极拥抱5G、工业物联网及数字孪生等先进技术&#xff0c;推动生产模式的全面升级与数字化转型。 客车制造5G智能工厂工业物联数字孪生平台的出现&#xff0c;不仅为行业…

Datawhale X 魔搭 AI夏令营-大模型技术(微调)-大模型评分

大语言模型&#xff08;LLMs&#xff09;在自动化复杂评分任务和增强决策过程方面展示了巨大的潜力。从作文评分到信用风险评估&#xff0c;LLMs 已表现出卓越的文本理解和分析能力。然而&#xff0c;要充分利用LLMs的潜力&#xff0c;必须探索如何将它们与其他AI形式&#xff…

Python数据分析项目实战01_票房榜单分析和pyecharts大屏可视化

一&#xff1a;最终大屏效果展示 由于生成了html网页只能在本地上显示&#xff0c;这个大屏是动态的&#xff0c;只能显示其中的图片。如果要分享给他人使用&#xff0c;就需要将html源码转为网页。 生成的html源码入口&#xff1a;‬​‍​‌‌​⁠​​​‌‍​​​​​‬&a…

百日筑基第五十七天-虚拟线程

百日筑基第五十七天-虚拟线程 前提 JDK19于2022-09-20发布GA版本&#xff0c;该版本提供了虚拟线程的预览功能。下载JDK19之后翻看了一下有关虚拟线程的一些源码&#xff0c;跟早些时候的Loom项目构建版本基本并没有很大出入&#xff0c;也跟第三方JDK如鹅厂的Kona虚拟线程实…