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

本文主要是介绍【学习AI-相关路程-工具使用-自我学习-Ubuntucudavisco-开发工具尝试-基础样例 (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、总结

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

这篇关于【学习AI-相关路程-工具使用-自我学习-Ubuntucudavisco-开发工具尝试-基础样例 (2)】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.