【学习AI-相关路程-工具使用-自我学习-cudavisco-开发工具尝试-基础样例 (2)】

【学习AI-相关路程-工具使用-自我学习-cuda&visco-开发工具尝试-基础样例 (2)】

  • 1、前言
  • 2、环境说明
  • 3、总结说明
  • 4、工具安装
      • 0、验证cuda
      • 1、软件下载
      • 2、插件安装
  • 5、软件设置与编程练习
      • 1、创建目录
      • 2、编译软件进入目录&创建两个文件
      • 3、编写配置文件
      • 5、编写代码文件
      • 6、调试&验证
      • 7、代码解读
          • (1)包含头文件和定义CUDA内核
          • (2)主函数内的变量定义和内存分配
          • (3)初始化向量并复制到设备
          • (4)内核调用
          • (5)检查错误和回复结果
          • (6)验证结果
          • (7)清理内存
  • 6、代码链接
  • 7、细节部分
      • 1、问题1:一个错误
      • 2、问题:使用命令nvidia-smi,无法调出如下信息。
      • 3、Tasks:configure tasks,自动创建tasks.json
  • 8、总结

1、前言

我们之前安装了cuda,但是我们其实是无法直接使用cuda的,还需要编译器,类似前端,供我们输入代码,好让我们可以将思想延伸。

同时也本篇,也是续写上一篇,我们将在本篇安装开发工具,来写一个简单dome,调用cuda平台相关套件,相当hello world。

前文链接:【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda-工具安装 (1)】

2、环境说明

这里准备安装Visual Studio code 这个工具,可以看到,只用这个工具是支持不同系统的,visual studio,只是支持win下。

下载链接:https://visualstudio.microsoft.com/zh-hans/

在这里插入图片描述

当然如果使用运行cuda,还可以使用Python 语言,是使用另一个工具,目前自己刚学到这里,以后要是学了再写文章。

3、总结说明

(1)了解Visual Studio code
一般来说,想编写程序的话,或多或少,都会了解到这个工具,即使没用过,也会听过。更多的可以看文档。
链接文档:https://code.visualstudio.com/docs
在这里插入图片描述
如果因为不太好,可以选择一些翻译工具。

(2)装插件和cuda
安装好了编译工具后,就是安装插件工具,因为Visual Studio code本身支持很多,不是一起全部安装的,需要根据自己需求灵活选。

(3)练习代码
最后就是练习一下代码,调用对库,在编译好的软件,运行过程中,就是在使用GPU了。我们通过这个简单样例,来熟悉一下一些库。

4、工具安装

0、验证cuda

使用其他工具前,先要验证下,自己是否已经支持了cuda,或者说是否已经安装了cuda。

nvcc -V
或者
nvcc --version

一般来说安装好后,会出现如下信息。
在这里插入图片描述

1、软件下载

如下链接,选择一个自己合适的版本。

下载链接:https://visualstudio.microsoft.com/zh-hans/#vscode-section

在这里插入图片描述
安装命令:

sudo dpkg -i code_1.89.0-1714530869_amd64.deb

2、插件安装

如下图,我这里编写c/c++语言和cuda,一搜基本就会出来。
在这里插入图片描述

如下是我自己的选择的插件
在这里插入图片描述

5、软件设置与编程练习

1、创建目录

我们先在桌面创建一个文件夹,自己自己定就好,不必和我一致。

在这里插入图片描述

2、编译软件进入目录&创建两个文件

我们用Visual Studio code软件进入对应目录,然后创建两个文件。之后就是准备编写内容了。
在这里插入图片描述

3、编写配置文件

配置文件,顾名思义,就是告诉编译器,去哪里找工具,使用什么工具编译等等配置信息的文件。

{"version": "2.0.0","tasks": [{"label": "Build CUDA project","type": "shell","command": "/usr/local/cuda/bin/nvcc","args": ["-arch=sm_35", // 根据你的GPU架构适当修改"${file}","-o","${fileDirname}/${fileBasenameNoExtension}.out"],"group": {"kind": "build","isDefault": true},"problemMatcher": "$gcc"}]
}

如下为截图。
在这里插入图片描述

5、编写代码文件

代码文件,就是我们实际要编写代码的文件,也是我们想法延伸。

#include <stdio.h>// CUDA Kernel for Vector Addition
__global__ void vecAdd(float *A, float *B, float *C, int N) {int i = blockDim.x * blockIdx.x + threadIdx.x;if (i < N) {C[i] = A[i] + B[i];}
}int main() {int N = 1024; // Size of vectorsfloat *h_A, *h_B, *h_C; // Host vectorsfloat *d_A, *d_B, *d_C; // Device vectors// Allocate memory on hosth_A = (float *)malloc(N * sizeof(float));h_B = (float *)malloc(N * sizeof(float));h_C = (float *)malloc(N * sizeof(float));// Initialize host vectorsfor (int i = 0; i < N; i++) {h_A[i] = i;h_B[i] = i * 2;}// Allocate memory on devicecudaMalloc(&d_A, N * sizeof(float));cudaMalloc(&d_B, N * sizeof(float));cudaMalloc(&d_C, N * sizeof(float));// Copy host vectors to devicecudaMemcpy(d_A, h_A, N * sizeof(float), cudaMemcpyHostToDevice);cudaMemcpy(d_B, h_B, N * sizeof(float), cudaMemcpyHostToDevice);// Kernel launchint threadsPerBlock = 256;int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;vecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);// Check for any errors launching the kernelcudaError_t err = cudaGetLastError();if (err != cudaSuccess) {fprintf(stderr, "Failed to launch vecAdd kernel (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}// Copy result back to hostcudaMemcpy(h_C, d_C, N * sizeof(float), cudaMemcpyDeviceToHost);// Check for any errors after the kernel launcherr = cudaGetLastError();if (err != cudaSuccess) {fprintf(stderr, "Failed to copy vector C from device after kernel execution (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}// Verify resultsbool success = true;for (int i = 0; i < N; i++) {if (h_C[i] != h_A[i] + h_B[i]) {printf("Error at position %d\n", i);success = false;break;}}if (success) {printf("Vector addition successful!\n");}// Free memoryfree(h_A);free(h_B);free(h_C);cudaFree(d_A);cudaFree(d_B);cudaFree(d_C);return 0;
}

以下为截图
在这里插入图片描述

6、调试&验证

自己在调试

(1)调试
在这里插入图片描述

(2)成功
在这里插入图片描述

7、代码解读

本代码是在网上找到一个样例,是一个使用CUDA进行向量加法的简单例子。

简单理解下,以后看多了大概就明白了。

(1)包含头文件和定义CUDA内核
#include <stdio.h>// CUDA Kernel for Vector Addition
__global__ void vecAdd(float *A, float *B, float *C, int N) {int i = blockDim.x * blockIdx.x + threadIdx.x;if (i < N) {C[i] = A[i] + B[i];}
}
(2)主函数内的变量定义和内存分配
int main() {int N = 1024; // Size of vectorsfloat *h_A, *h_B, *h_C; // Host vectorsfloat *d_A, *d_B, *d_C; // Device vectorsh_A = (float *)malloc(N * sizeof(float));h_B = (float *)malloc(N * sizeof(float));h_C = (float *)malloc(N * sizeof(float));cudaMalloc(&d_A, N * sizeof(float));cudaMalloc(&d_B, N * sizeof(float));cudaMalloc(&d_C, N * sizeof(float));
(3)初始化向量并复制到设备
    for (int i = 0; i < N; i++) {h_A[i] = i;h_B[i] = i * 2;}cudaMemcpy(d_A, h_A, N * sizeof(float), cudaMemcpyHostToDevice);cudaMemcpy(d_B, h_B, N * sizeof(float), cudaMemcpyHostToDevice);
(4)内核调用
    int threadsPerBlock = 256;int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;vecAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);
(5)检查错误和回复结果
    cudaError_t err = cudaGetLastError();if (err != cudaSuccess) {fprintf(stderr, "Failed to launch vecAdd kernel (error code %s)!\n", cudaGetErrorString(err));exit(EXIT_FAILURE);}cudaMemcpy(h_C, d_C, N * sizeof(float), cudaMemcpyDeviceToHost);
(6)验证结果
    bool success = true;for (int i = 0; i < N; i++) {if (h_C[i] != h_A[i] + h_B[i]) {printf("Error at position %d\n", i);success = false;break;}}if (success) {printf("Vector addition successful!\n");}
(7)清理内存
    free(h_A);free(h_B);free(h_C);cudaFree(d_A);cudaFree(d_B);cudaFree(d_C);

6、代码链接

代码链接:https://download.csdn.net/download/qq_22146161/89273073

7、细节部分

1、问题1:一个错误

具体什么错误有点记不清了,这里记录下吧。
在这里插入图片描述

2、问题:使用命令nvidia-smi,无法调出如下信息。

在这里插入图片描述
如上图,自己在安装过程中,突然发现nvidia-smi命令,因为一直安装各种东西,应该是影响到了,不反馈信息,后重启解决了

3、Tasks:configure tasks,自动创建tasks.json

稍微有点时间,不过我没记错的话,使用 查看>>命令面板,可以直接创建这个tasks.json文件。
在这里插入图片描述
如下步骤

在这里插入图片描述
在这里插入图片描述

8、总结

很多时候,其实是无法理解每一步,只有常看,才能大致记住,更多调试,后续也会慢慢学习。

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

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

相关文章

Rust Postgres实例

Rust Postgres介绍 Rust Postgres是一个纯Rust实现的PostgreSQL客户端库&#xff0c;无需依赖任何外部二进制文件2。这意味着它可以轻松集成到你的Rust项目中&#xff0c;提供对PostgreSQL的支持。 特点 高性能&#xff1a;Rust Postgres提供了高性能的数据库交互功能&#…

js api part4

其他事件 页面加载事件 外部资源&#xff08;如图片、外联CSS和JavaScript等&#xff09;加载完毕时触发的事件 原因&#xff1a;有些时候需要等页面资源全部处理完了做一些事情&#xff0c;老代码喜欢把 script 写在 head 中&#xff0c;这时候直接找 dom 元素找不到。 事件…

获取转转数据,研究完转转请求,tx在算法方面很友好。

本篇文章仅供学习讨论。 文章中涉及到的代码、实例&#xff0c;仅是个人日常学习研究的部分成果。 如有不当&#xff0c;请联系删除。 在研究完阿里的算法以后&#xff08;其实很难说研究完&#xff0c;还有很多内容没有研究透&#xff0c;只能说暂时告一段落&#xff09;&…

服务智能化公共生活场景人员检测计数,基于YOLOv5全系列参数模型【n/s/m/l/x】开发构建公共生活场景下人员检测计数识别系统

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;各种智能化系统已广泛应用于各个领域&#xff0c;特别是在人员密集、流动性大的场合&#xff0c;如商场、火车站、景区等&#xff0c;智能人员检测计数系统发挥着至关重要的作用。特别是在特殊时期&#xff0c;如节假日、…

cmake进阶:变量的作用域说明三(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下&#xff1a; cmake进阶&#xff1a;变量的作用域说明一&#xff08;从函数作用域方面&#xff09;-CSDN博客cmake进阶&#xff1a;变量的作用域说明二&#xff08;从函数作用域方面&#xff09;-CSDN博客…

C++:多继承虚继承

在C中&#xff0c;虚继承&#xff08;Virtual Inheritance&#xff09;是一种特殊的继承方式&#xff0c;用于解决菱形继承&#xff08;Diamond Inheritance&#xff09;问题。菱形继承指的是一个类同时继承自两个或更多个具有共同基类的类&#xff0c;从而导致了多个实例同一个…

Problem 5: Whack-A-Mole打地鼠

实战题&#xff1a;打地鼠 内容如附件所示&#xff1a; 测试数据为:1,2,4,8,9,10,11,14 答案为&#xff1a;10,2,4 原始分布&#xff1a; 击打10号 击打2号 击打4号 要求&#xff0c;所示实例解以图示的方式给出&#xff0c;并且5组测试数据都需要测试&#xff0c;…

Labels and Databases for Mac:强大的标签与数据库管理工具

Labels and Databases for Mac是一款集标签制作与数据库管理于一体的强大工具&#xff0c;专为Mac用户打造&#xff0c;旨在提供高效、便捷的标签制作与数据管理体验。 这款软件拥有丰富的内置标签格式&#xff0c;用户可轻松创建各种标签、信封和卡片&#xff0c;满足个性化需…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具&#xff0c;其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先&#xff0c;PopChar为Mac提供了访问所有字体字符的能力&#xff0c;包括那些难以通过键盘直接输入的字符。用户只…

STM32编译前置条件配置

本文基于stm32f104系列芯片&#xff0c;记录编程代码前需要的操作&#xff1a; 添加库文件 在ST官网下载标准库STM32F10x_StdPeriph_Lib_V3.5.0&#xff0c;解压后&#xff0c;得到以下界面 启动文件 进入Libraries&#xff0c;然后进入CMSIS&#xff0c;再进入CM3&#xff…

青春送温暖 立夏寄真情

&#xff08;通讯员&#xff1a;赵灿飞 图&#xff1a;杨美、孙红浪&#xff09; 在青春洋溢的五月&#xff0c;为传承中华民族尊老敬老的传统美德&#xff0c;促进当代青年与老人的跨代交流&#xff0c;增强青年的社会责任感和使命感&#xff0c;传递正能量和关爱困难群体…

ubuntu 安装单节点HBase

下载HBase mkdir -p /home/ellis/HBase/ cd /home/ellis/HBase/ wget https://downloads.apache.org/hbase/2.5.8/hbase-2.5.8-bin.tar.gz tar -xvf hbase-2.5.8-bin.tar.gz安装java jdk sudo apt install openjdk-11-jdksudo vim /etc/profileexport JAVA_HOME/usr/lib/jvm/…

代码随想录算法训练营Day12 | 二叉树理论基础、递归遍历、迭代遍历、统一迭代

今日收获&#xff1a; 二叉树的递归遍历二叉树的迭代遍历&#xff0c;中序的迭代法和前、后序不一样二叉树的统一迭代法主要是用了标记法来实现&#xff08;要处理的节点放入栈之后&#xff0c;紧接着放入一个空指针作为标记&#xff09; 二叉树理论基础篇 题目分类 题目分…

第一篇:刚接触测试你应该知道什么

欢迎你接触软件测试这一行业。 刚接触它时&#xff0c;你肯定或多或少会有疑惑&#xff0c;我该做什么&#xff1f;大家口口相传的软件测试就是 【点点点】 真的是你日常的工作吗&#xff1f; 那么本文我将陪你一起&#xff0c;对我们刚接触到测试这个工作以后&#xff0c;应该…

cmake进阶:变量的作用域说明二(从函数作用域方面)

一. 简介 前一篇文章从函数作用域方面学习了 变量的作用域。文章如下&#xff1a; cmake进阶&#xff1a;变量的作用域-CSDN博客 本文继续从函数作用域方面学习了 变量的作用域。 二. 变量的作用域 1. 函数内定义与外部同名的变量 向顶层 CMakeLists.txt添加如下代码&a…

java08基础(值传递和引用传递 类和对象)

目录 一. 值传递和引用传递 1. 值传递 2. 引用传递 二. 面向对象思想 三. 类和对象 1. 类 2. 对象 2.1 使用 2.2 成员变量和局部变量区别 2.3 操作成员方法 2.4 this关键字(初始) 2.5 构造方法 (见java09) 一. 值传递和引用传递 1. 值传递 值传递是指在调用函数时将…

Open CASCADE学习|三重正交标架法则

三重正交标架&#xff08;Trihedron&#xff09; 定义:三重正交标架是在三维空间中定义的一个坐标系&#xff0c;由三个互相垂直的向量构成。这些向量分别是&#xff1a; 切线向量&#xff08;Tangent Vector&#xff09; - 表示曲线在某一特定点处的切线方向。 主法线向量&…

越权漏洞!

越权漏洞是指在一个系统或应用程序中存在某种不当的访问权限&#xff0c;使得攻击者可以获得比其应该拥有的权限更高的权限。这种漏洞可能允许攻击者执行未经授权的操作&#xff0c;例如访问他人的敏感数据、修改系统设置、执行恶意代码等。越权漏洞通常是由于设计或实现上的错…

淡茶怎么泡?

很多人都知道喝浓茶对身体不好&#xff0c;但是怎么冲泡淡茶却一知半解。按照《品深淡茶冲泡标准》中对绿茶冲泡淡茶的规定&#xff0c;冲泡的茶汤中咖啡碱不得高于31.67mg/100mL&#xff0c;可可碱不得高于2.67mg/mL&#xff0c;茶碱不得高于1.50mg/100mL&#xff0c;茶多酚不…

[C++核心编程-03]----C++函数提高学习

目录 引言 正文 01-函数提升简介 02-函数默认参数 03-函数占位参数 04-函数重载 05-函数重载的注意事项 总结 引言 函数在C编程中扮演着至关重要的角色&#xff0c;通过合理使用函数&#xff0c;可以提高程序的结构性、灵活性、可读性和维护性。因此&…