提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

本文通过windows自带的subsystem for linux(wsl),对比MPI和cuda对并行程序的加速能力。


提示:以下是本篇文章正文内容,下面案例可供参考

一、先决条件

WSL+vscode+c语言!!!

wsl和vscode的安装参考以下文章:

(9 封私信 / 78 条消息) Win11上配置Linux子系统(WSL)+vscode使用 - 知乎

WSL2的安装与配置(创建Anaconda虚拟环境、更新软件包、安装PyTorch、VSCode)-CSDN博客

window中的c和c++语言环境的配置参考:

(7 封私信) 基于 VS Code 搭建编程环境——C/C++ 篇 - 知乎

Linux中的c和c++语言环境的配置参考:

(7 封私信) 详解Linux下使用vscode编译运行和调试C/C++ - 知乎

其中注意以下几点:

1.task.json 配置,用F1+tasks:configuration task(在F1 中search)

二、cuda环境配置

        cuda是我们用gpu实现高性能计算的基础,cuda本质上是通过直接在gpu上编程,从而实现并行式的调用和相关计算。那么什么是cuda,我们要如何安装?最后我们如何编程这是下面我们解决的问题。

1.什么是cuda?nvidia的驱动版本怎么选?

重点需要关注的有下方三个红色框选:

最下方就是你的显卡型号,左上角是当前的显卡驱动版本,右上角是当前显卡驱动最高支持的 CUDA 版本(向下兼容),但并不代表环境中的 CUDA 版本!!!

所以,当你发现 CUDA 版本出问题时,记得来这里看看:右上角红框的数字是多少?

引用于https://www.zhihu.com/question/622711856/answer/21538453583

作者:AI码上来

1.1 Pytorch 下安装

大白话来讲:

  • CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的并行计算库,旨在充分发挥 GPU 的并行计算能力,实现计算加速。
  • CuDNN(CUDA Deep Neural Network library)建立在 CUDA 之上,提供了一系列针对CNN/RNN等模型中算子的高效实现,比如卷积、池化、激活函数等。(通常,CUDACuDNN需要搭配使用)
  • nvcc 则是 CUDA 的编译器。

有同学说我在本地执行nvcc -V,提示找不到这个指令啊。

对啊,说明你在本地没安装 cuda,哪来的编译器呢?

那我要一顿操作,先下载并安装 cuda 么?

推荐你不用,因为你安装 cuda,大概率是用 Pytorch 等深度学习库,需要依赖它。

而当你安装不同版本的 Pytorch,你会发现它要求的 CUDA/CuDNN 版本还不一样。

所以,我们这一部分,不需进行任何操作,等你用到不同版本深度学习库时,再来安装对应版本的 CUDACuDNN 即可!

接着往下看!

Pytorch 非常友好,因为它会自动根据你的当前环境,安装对应版本的CUDACuDNN

所以,如果你的项目依赖 Pytorch,压根无需手动安装CUDACuDNN

最优雅的方式是,新建一个虚拟环境,一键安装指定版本的 torch 即可,比如:

conda env create -n torchenv python==3.8
conda activate torchenv
pip install torch==2.0.1


作者:AI码上来
链接:https://www.zhihu.com/question/622711856/answer/21538453583
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2.搭建cuda

        现在我们开始搭建cuda:

具体参考WLS2安装CUDA保姆级教程_wsl2 cuda-CSDN博客

最后检验安装用nvcc --version,如下输出就视为安装成功。

binpj@bin:~$ source ~/.bashrc
binpj@bin:~$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2025 NVIDIA Corporation
Built on Wed_Jan_15_19:20:09_PST_2025
Cuda compilation tools, release 12.8, V12.8.61
Build cuda_12.8.r12.8/compiler.35404655_0

参考文献:

(7 封私信) WSL2安装CUDA,nvidia环境小白教程和踩坑记录 - 知乎

3.测试cuda

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

// Simple CUDA error checking macro
#define CHECK(call)                                                      \
{                                                                        \
    cudaError_t err = call;                                              \
    if (err != cudaSuccess) {                                            \
        std::cerr << "CUDA error in " << __FILE__ << ":" << __LINE__     \
                  << " : " << cudaGetErrorString(err) << std::endl;      \
        exit(EXIT_FAILURE);                                              \
    }                                                                    \
}

int main() {
    int dev = 0;
    cudaDeviceProp devProp;

    // Get GPU device properties
    CHECK(cudaGetDeviceProperties(&devProp, dev));

    std::cout << "Using GPU device " << dev << ": " << devProp.name << std::endl;
    std::cout << "--------------------------------------------" << std::endl;
    std::cout << "Number of SMs: " << devProp.multiProcessorCount << std::endl;
    std::cout << "Shared memory per block: "
              << devProp.sharedMemPerBlock / 1024.0 << " KB" << std::endl;
    std::cout << "Max threads per block: " << devProp.maxThreadsPerBlock << std::endl;
    std::cout << "Max threads per SM: " << devProp.maxThreadsPerMultiProcessor << std::endl;
    std::cout << "Max warps per SM: "
              << devProp.maxThreadsPerMultiProcessor / 32 << std::endl;
    std::cout << "Warp size: " << devProp.warpSize << std::endl;
    std::cout << "Max grid dimensions (x, y, z): ("
              << devProp.maxGridSize[0] << ", "
              << devProp.maxGridSize[1] << ", "
              << devProp.maxGridSize[2] << ")" << std::endl;
    std::cout << "Max block dimensions (x, y, z): ("
              << devProp.maxThreadsDim[0] << ", "
              << devProp.maxThreadsDim[1] << ", "
              << devProp.maxThreadsDim[2] << ")" << std::endl;
    std::cout << "Compute capability: "
              << devProp.major << "." << devProp.minor << std::endl;
    std::cout << "Total global memory: "
              << devProp.totalGlobalMem / (1024.0 * 1024.0) << " MB" << std::endl;

    return 0;
}

输出为

binpj@bin:~/SWD$ ./gpu_info 
Using GPU device 0: NVIDIA GeForce RTX 4060 Ti
--------------------------------------------
Number of SMs: 34
Shared memory per block: 48 KB
Max threads per block: 1024
Max threads per SM: 1536
Max warps per SM: 48
Warp size: 32
Max grid dimensions (x, y, z): (2147483647, 65535, 65535)
Max block dimensions (x, y, z): (1024, 1024, 64)
Compute capability: 8.9
Total global memory: 8187.5 MB

三、openMP的环境搭建

Ubuntu系统上openMP环境的配置_ubuntu openmp-CSDN博客

本质上gcc自带openMP,不用更多的环境配置!!以下这个代码输出openMP的version:

echo | gcc -fopenmp -dM -E - | grep -i openmp

下面是一个openmp_hello:

// openmp_hello.c 
#include <stdio.h> 
#include <omp.h> 

int main() { 
    // 设置线程数 
    omp_set_num_threads(4); 
    
    // 并行区域 - 修正语法
    #pragma omp parallel
    { 
        // 获取当前线程号和总线程数 
        int thread_id = omp_get_thread_num(); 
        int num_threads = omp_get_num_threads(); 
        printf("Hello from thread %d out of %d threads\n", thread_id, num_threads); 
    } 
    
    return 0; 
}

如果你想知道自己cpu的核心数

// check_cores.c
#include <stdio.h>
#include <omp.h>

int main() {
    int num_cores = omp_get_num_procs();
    printf("系统有 %d 个处理器核心\n", num_cores);
    
    return 0;
}
(base) binpj@bin:~/project/helloworld$ ./core
系统有 28 个处理器核心

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐