WSL2Linux 子系统(十二)

news2024/10/6 8:51:22

wsl 子系统安装 cuda 环境

《WSL2Linux 子系统(十一)》讲述 WSL 网络转为桥接模式的两种方法,WSL 网络桥接模式无论是静态 IP 还是动态分配 IP 均支持。本篇文章则是简单讲述 WSL 安装 cuda 环境。

作者:炭烤毛蛋 ,点击博主了解更多。


提示: 请按照系统版本安装指定 cuda。

文章目录

  • wsl 子系统安装 cuda 环境
  • 1. 安装 cuda
  • 2. 配置 cuda 环境变量
  • Tips
  • 参考资料
  • 结语


1. 安装 cuda

  • 下载安装包
    本文 Linux 版本使用 Ubuntu 20.04,安装 cuda 环境需要匹配系统 Linuix,系统平台 x86_64, 系统分支为 WSL-Ubuntu,WSL 2.版本,此处使用本地安装脚本 runfile。
    cuda 下载链接为 https://developer.nvidia.com/cuda-11.3.0-download-archive?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_network
    cuda-url

  • 下载在线安装类型中 runfile (local),

wget https://developer.download.nvidia.com/compute/cuda/11.3.0/local_installers/cuda_11.3.0_465.19.01_linux.run
  • 安装 cuda
    直接运行 cuda 安装脚本。
sudo sh cuda_11.3.0_465.19.01_linux.run

跳过安装过程错误提示执行安装脚本。

sudo sh cuda_11.3.0_465.19.01_linux.run --override

2. 配置 cuda 环境变量

安装完成,配置环境变量

sudo vim ~/.bashrc
#在环境变量配置文件中增加 cuda 变量
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
export PATH=$PATH:/usr/local/cuda/bin

生效刚修改配置。

source ~/.bashrc

#查看cuda版本

nvcc -V

查看nvidia界面,这个需要在原本的Windows系统上安装nvidia驱动的

nvidia-smi

可以正常显示 cuda 版本证明 cuda 环境安装完成。

Tips

  1. 安装 cuda 后遗漏 gcc
    缺少 gcc 错误提示如下:
unsupported GNU version! gcc versions later than 10 are not supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.

由于linux中可以有多个版本的gcc和g++,我们可以为系统默认的gcc和g++指定特定的默认版本。对于cuda的nvcc来说有更方便的方法,那就是nvcc会优先读取自身路径下的gcc然后如果没有再读取系统默认路径下的gcc。只需要为nvcc设置特定版本gcc的软连接。

查看当前 gcc 版本

gcc -v

本文中使用 cuda 指定安装 gcc version10 版本,

sudo apt-get install gcc-10
sudo apt-get install g++-10

gcc 软链接到 cuda 目录

sudo ln -s /usr/bin/gcc-10 /usr/local/cuda/bin/gcc
  1. 验证 cuda
    编写一个简单的 CUDA 程序,并进行交叉编译和执行。这个文件命名为 a.cu,在以下增加如下内容:
// a.cu
#include <iostream>

__global__ void vectorAdd(const float* A, const float* B, float* C, int N) {
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    if (i < N) {
        C[i] = A[i] + B[i];
    }
}

int main() {
    int N = 1 << 20; // 1M elements
    size_t size = N * sizeof(float);

    // Allocate host memory
    float* h_A = (float*)malloc(size);
    float* h_B = (float*)malloc(size);
    float* h_C = (float*)malloc(size);

    // Initialize input vectors
    for (int i = 0; i < N; ++i) {
        h_A[i] = i;
        h_B[i] = i;
    }

    // Allocate device memory
    float *d_A, *d_B, *d_C;
    cudaMalloc(&d_A, size);
    cudaMalloc(&d_B, size);
    cudaMalloc(&d_C, size);

    // Copy data from host to device
    cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);

    // Execute kernel
    int threadsPerBlock = 256;
    int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
    vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);

    // Copy result from device to host
    cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);

    // Verify results
    for (int i = 0; i < N; ++i) {
        if (h_C[i] != h_A[i] + h_B[i]) {
            std::cerr << "Error at index " << i << ": " << h_C[i] << std::endl;
            return -1;
        }
    }

    std::cout << "Vector addition completed successfully." << std::endl;

    // Free memory
    free(h_A);
    free(h_B);
    free(h_C);
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    return 0;
}

使用 NVIDIA 的 nvcc 编译器来编译 CUDA 文件。

nvcc -o vectorAdd a.cu

在终端中运行生成的可执行文件。

./vectorAdd

提示:编译时指定架构:使用 -gencode 标志为特定架构生成代码。

nvcc -o vectorAdd a.cu -gencode arch=compute_52,code=sm_52

参考资料

CUDA Programming Guide
NVIDIA Developer Zone

结语

不枉博主详细讲解,欢迎订阅博主–炭烤毛蛋 。

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

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

相关文章

3种框架助你绘制完美技术路线图,导师一眼就认可

我是娜姐 迪娜学姐 &#xff0c;一个SCI医学期刊编辑&#xff0c;探索用AI工具提效论文写作和发表。 一份好的技术路线图&#xff0c;不仅能让导师和评委一目了然地了解你的研究计划&#xff0c;还能为你的整个研究过程提供清晰的指导。但是&#xff0c;不少学生在制作时往往摸…

MFC多媒体定时器实例(源码下载)

用MFC多媒体定时器做一个每1秒钟加一次的计时器&#xff0c;点开始计时按钮开始计时&#xff0c;点关闭计时按钮关闭计时。 1、在库文件Med_timeDlg.h文件中添加代码 class CMed_timeDlg : public CDialog { // Construction public:CMed_timeDlg(CWnd* pParent NULL); // st…

展锐平台WIFI国家码信道总结

展锐平台WIFI国家码信道总结 1.下载wireless-regdb wireless-regdb是一个开源的工程,编译它会生成regulatory.bin文件,这实际上是一个加密后的数据库,它记录各个国家可用的无线频段。 可从下面的网站上下载最新的regdb库: https://git.kernel.org/pub/scm/linux/kernel…

在3damax重创建了一个材质,然后在场景中也没有应用这个材质,将材质编辑器窗口重置,如何找回创建的材质(如何找回创建但是没有应用的材质(大概率找不回啦))

在3damax重创建了一个材质&#xff0c;然后在场景中也没有应用这个材质&#xff0c;将材质编辑器窗口重置&#xff0c;如何找回创建的材质&#xff08;如何找回创建但是没有应用的材质&#xff09; 检查场景文件&#xff1a; 如果你在保存场景文件的时候&#xff0c;那个材质也…

计算机的错误计算(一百一十四)

摘要 回复读者提问&#xff0c;就计算机的错误计算&#xff08;六&#xff09;中案例&#xff0c;讨论其另外一种形式&#xff1a; 的错误计算问题。 一读者来信说&#xff0c;在计算机的错误计算&#xff08;六&#xff09;中&#xff0c;使用了两种计算方法。实际上&#xf…

unity 2d 近战攻击判定的三种方式

1. 给攻击帧添加碰撞盒 优点&#xff1a;配置直观&#xff0c;无需事件触发 缺点&#xff1a;无法定制&#xff0c;效率低 检测放在子物体&#xff0c;可以控制旋转 添加触发器事件 注意OnTriggerEnter2D只会在挂载了collider的组件上触发 protected virtual void OnTrigge…

介绍一款开源的 Modern GUI PySide6 / PyQt6的使用

首先附上大神的开源地址&#xff08;自行克隆吧&#xff09;&#xff1a; https://github.com/Wanderson-Magalhaes/Modern_GUI_PyDracula_PySide6_or_PyQt6 步骤一&#xff1a;安装PySide6库 pip install PySide6 步骤二&#xff1a;运行main文件 python main.py 就得…

vite学习教程04、vue集成axios封装request工具类及应用

文章目录 前言1、安装axios2、封装request工具类3、封装api请求工具4、实战&#xff1a;vue中使用api请求工具类资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技…

Java | Leetcode Java题解之第459题重复的子字符串

题目&#xff1a; 题解&#xff1a; class Solution {public boolean repeatedSubstringPattern(String s) {return kmp(s s, s);}public boolean kmp(String query, String pattern) {int n query.length();int m pattern.length();int[] fail new int[m];Arrays.fill(fa…

不小心误删了虚拟环境.venv的目录文件夹,导致无法运行指定目录下的 Python 解释器怎么办?

创建虚拟环境步骤&#xff08;Windows 系统&#xff09;&#xff1a; 1、打开cmd命令 2、进入项目目录&#xff0c;在命令行中输入&#xff1a;cd 项目所在的路径 3、创建新的虚拟环境&#xff08;python3.3以上的版本&#xff09;,在当前目录下创建一个名为 .myvenv 的新虚…

SQL专项练习第三天

在大数据处理中&#xff0c;Hive 是一个常用的工具&#xff0c;它可以对大规模数据进行高效的查询和分析。本文将介绍五个 Hive 数据处理问题的解决方案&#xff0c;并通过实际案例进行演示。 先在home文件夹下建一个hivedata文件夹&#xff0c;把我们所需的数据写成txt文件导…

Springboot 整合 logback 日志框架

文章目录 整合 Logback 日志框架第一步&#xff1a;导入依赖第二步&#xff1a;导入配置&#xff08;logback.xml&#xff09;详解 使用&#xff08;记录日志&#xff09; 遇到问题一解决方案 整合 Logback 日志框架 第一步&#xff1a;导入依赖 &#xff08;Springboot 会自己…

网站开发的发展(后端路由/前后端分离/前端路由)

1.后端路由阶段 在早期的网站开发中 网页的渲染工作其实是交由服务器完成的 所以该渲染也被称之为后端渲染 具体的过程就是&#xff1a;浏览器发送url给服务器 服务器解析该url 使用后端路由(在服务器中 用于储存url和页面映射关系的路由)获取指定url对应的页面 然后交由jsp去…

洛谷每日一题(P1229 遍历问题)

原题目链接&#xff1a; P1229 遍历问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 原题目截图&#xff1a; 思路分析&#xff1a; 1、为什么会出现多个不同序列&#xff1f; 前序遍历和后序遍历序列无法唯一确定一棵二叉树的原因主要在于这两种遍历方式都缺少了关于…

linux基础 超级笔记

1.Linux系统的组成 Linux系统内核&#xff1a;提供系统最核心的功能&#xff0c;如软硬件和资源调度。 系统及应用程序&#xff1a;文件、任务管理器。 2.Linux发行版 通过修改内核代码自行集成系统程序&#xff0c;即封装。比如Ubuntu和centos这种。不过基础命令是完全相…

Android.mk中宏定义的高级用法剖析-安卓framework高级实战

背景&#xff1a; 前面的blog有讲解如何在Android.mk中进行控制安卓cpp源码中ifdef定义变量-干货技能分享&#xff0c;主要就是针对c代码中经常出现的#ifdef判断进行了剖析和实战 但是仅仅有上面的ifdef判断这个宏是否存在是不是对宏定义作用没有发挥到最大&#xff0c;是否可…

esp8266 at指令链接wifi时一直connect disconnest

那是你的连接wifi的名字密码有误或者热点有问题&#xff0c;看看热点是不是把设备拉入黑名单或者设置为5G或者连了校园网或者设置了最多链接设备

vAPI靶场

前言 自行去搭建vAPI靶场&#xff0c;配合postman使用 vapi1 创建用户 第一个用户 {"username": "shi","name": "shi1","course": "nihao","id": 10 } 第二个用户 {"username": "hui…

Pandas -----------------------基础知识(主要matplotlib知识)(七)

Dataframe变形 转置 T import pandas as pddata {2022: [10, 30, 15, 20], 2023: [40, 50, 36, 21]} df1 pd.DataFrame(data, index[q1, q2, q3, q4]) print("原始数据框&#xff1a;") print(df1)df2 df1.Tprint("转换后数据框&#xff1a;") print(df…

并查集——从LeetCode题海中总结常见套路

目录 并查集定义 LeetCode128.最长连续序列 先去重再sort&#xff1a; 改进去重的方法&#xff1a; 参考&#xff1a; 并查集定义 在计算机科学中&#xff0c;并查集是一种树型的数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查…