Windows Subsystem for Linux——支持cuda能力

CUDA(Compute Unified Device Architecture,统一计算设备架构)是一种由NVIDIA公司推出的并行计算平台和编程模型,它特别适用于需要高性能计算(HPC)和大规模并行处理的场景。当我们在WSL2中开发深度学习与机器学习功能时,会遇到一个阻碍,就是Linux子系统如何调用宿主机的cuda驱动。本文我们将讲解如何解决这个问题。

Windows侧

确定GPU的型号

打开“设备管理器”,在“显示适配器”中找到GPU型号。
在这里插入图片描述
然后在https://www.nvidia.com/en-us/drivers/选择对应的GPU和操作系统型号。
在这里插入图片描述
下载并安装该程序。
然后我们在CMD中输入下面命令,查看cuda版本

nvcc --version

在这里插入图片描述

子系统侧

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local中选择WSL-Ubuntu对应的Toolkit
在这里插入图片描述
然后执行下面的命令
在这里插入图片描述

wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.6.1/local_installers/cuda-repo-wsl-ubuntu-12-6-local_12.6.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-6-local_12.6.1-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-6-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-6

测试

我们使用《管理Python虚拟环境的脚本》中的脚本,构建虚拟环境。

source env.sh init
source env.sh enter

然后安装相关依赖

source env.sh install numba
source env.sh install numpy

保存下面的Python代码,然后执行

import numba
from numba import cuda
import numpy as np
import time

def simulate_long_gpu_computation():
    # 检查是否有可用的GPU
    if not cuda.is_available():
        print("No GPU is available.")
        return

    # 打印可用的GPU信息
    print("GPU is available.")
    print("GPU name:", cuda.get_current_device().name)

    # 定义一个复杂的CUDA内核函数
    @cuda.jit
    def complex_computation(a, b, c):
        idx = cuda.grid(1)
        if idx < a.size:
            for _ in range(1000000):  # 增加计算量
                c[idx] += a[idx] * b[idx]

    # 初始化数据
    N = 1000000
    a = np.random.rand(N).astype(np.float32)
    b = np.random.rand(N).astype(np.float32)
    c = np.zeros(N, dtype=np.float32)

    # 将数据复制到GPU
    a_device = cuda.to_device(a)
    b_device = cuda.to_device(b)
    c_device = cuda.to_device(c)

    # 定义线程和块的数量
    threads_per_block = 256
    blocks_per_grid = (a.size + (threads_per_block - 1)) // threads_per_block

    # 启动CUDA内核函数
    start = time.time()
    complex_computation[blocks_per_grid, threads_per_block](a_device, b_device, c_device)
    cuda.synchronize()
    end = time.time()

    # 将结果复制回CPU
    c = c_device.copy_to_host()

    # 打印结果和计算时间
    print("Computation completed.")
    print("Time taken: {:.2f} seconds".format(end - start))
    print("Result (first 10 elements):", c[:10])

if __name__ == "__main__":
    simulate_long_gpu_computation()

可以看到如下输出
在这里插入图片描述
资源管理器中也会看到GPU的波动
在这里插入图片描述

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

breaksoftware

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值