问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

CUDA、CUDA Toolkit、CUDNN、NVCC关系详解

创作时间:
作者:
@小白创作中心

CUDA、CUDA Toolkit、CUDNN、NVCC关系详解

引用
CSDN
1.
https://m.blog.csdn.net/NiNg_1_234/article/details/144603227

CUDA、CUDA Toolkit、CUDNN和NVCC是NVIDIA GPU计算的核心组件。本文将详细解析这些组件的概念、区别及其相互关系,并提供使用示例。

核心组件解析

1. CUDA

CUDA(Compute Unified Device Architecture)是NVIDIA推出的并行计算平台和编程模型,它允许开发者使用NVIDIA GPU进行高性能计算。CUDA提供了一组库、编译器、运行时系统和开发工具,使开发者能够更轻松地利用GPU的计算能力。

2. CUDA Toolkit

CUDA Toolkit是NVIDIA提供的完整工具安装包,包括CUDA程序的编译器、IDE、调试器等,以及CUDA程序所对应的各式库文件和头文件。它为开发CUDA程序提供了必要的工具和库。

3. CUDNN

CUDNN(CUDA Deep Neural Network library)是NVIDIA为深度学习计算设计的软件库,专门用于深度学习的GPU加速。它提供了多种深度学习算法的优化版本,如卷积、池化等,显著提升了计算效率。

4. NVCC

NVCC(CUDA Compiler)是CUDA Toolkit中的编译器,它将CUDA源代码中的GPU部分编译成PTX代码(中间表示),然后通过驱动程序将PTX转化为适配GPU架构的二进制文件。NVCC还会将非CUDA部分代码传递给主机C++编译器(如g++),实现混合编译。

版本管理

1. PyTorch与CUDA版本

PyTorch在运行时会寻找可用的CUDA路径,其过程如下:

  1. 环境变量CUDA_HOME 或 CUDA_PATH
  2. /usr/local/cuda
  3. which nvcc的上级上级目录(which nvcc会在环境变量PATH中找)
  4. 如果上述都不存在,则torch.utils.cpp_extension.CUDA_HOME为None,会使用conda安装的cudatoolkit

2. conda下的cudatoolkit

通过conda安装的cudatoolkit包含的库文件通常位于~/miniconda3/lib中,或者在miniconda3/pkgs/cudatoolkit-xxx/lib中查看。conda的cudatoolkit只包含PyTorch或其他框架会使用到的so库文件。

3. nvidia-smi和nvcc显示的CUDA版本

nvidia-smi和nvcc显示的CUDA版本可能不同,因为:

  • nvidia-smi属于driver API,用于支持driver API的必要文件(如libcuda.so)是由GPU driver installer安装的。
  • nvcc属于runtime API,用于支持runtime API的必要文件(如libcudart.so以及nvcc)是由CUDA Toolkit installer安装的。

使用示例

1. 编译CUDA程序

以下是一个简单的CUDA程序示例,用于向量加法:

// vector_add.cu
#include <stdio.h>
__global__ void add(int n, float *x, float *y)
{
  int index = blockIdx.x * blockDim.x + threadIdx.x;
  int stride = blockDim.x * gridDim.x;
  for (int i = index; i < n; i += stride)
    y[i] = x[i] + y[i];
}
int main(void)
{
  int N = 1<<20; // 1M elements
  float *x = NULL;
  float *y = NULL;
  
  // Allocate memory on the host side
  x = (float*)malloc(N * sizeof(float));
  y = (float*)malloc(N * sizeof(float));
  
  // Initialize x and y
  for (int i = 0; i < N; ++i) {
    x[i] = 1.0f;
    y[i] = 2.0f;
  }
  
  // Allocate memory on the device side
  float *d_x = NULL;
  float *d_y = NULL;
  cudaMalloc((void**)&d_x, N * sizeof(float));
  cudaMalloc((void**)&d_y, N * sizeof(float));
  
  // Copy inputs from host to device
  cudaMemcpy(d_x, x, N * sizeof(float), cudaMemcpyHostToDevice);
  cudaMemcpy(d_y, y, N * sizeof(float), cudaMemcpyHostToDevice);
  
  // Launch the kernel
  int threadsPerBlock = 256;
  int blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
  add<<<blocksPerGrid, threadsPerBlock>>>(N, d_x, d_y);
  
  // Copy the result from device to host
  cudaMemcpy(y, d_y, N * sizeof(float), cudaMemcpyDeviceToHost);
  
  // Check for any errors launching the kernel
  cudaError_t err = cudaGetLastError();
  if (err != cudaSuccess) {
    printf("Error: %s\n", cudaGetErrorString(err));
    // exit(EXIT_FAILURE);
  }
  
  // Compute an error norm
  float norm = 0, ref_norm = N*3.0f;
  for (int i = 0; i < N; ++i)
    norm += (y[i] - 3.0f) * (y[i] - 3.0f);
  norm = sqrt(norm / N);
  
  printf("Relative L1 error: %.5f\n", norm / ref_norm);
  
  // Free device memory
  cudaFree(d_x);
  cudaFree(d_y);
  
  // Free host memory
  free(x);
  free(y);
  
  return 0;
}

编译上述程序时,可以使用NVCC命令:

nvcc vector_add.cu -o vector_add

总结

CUDA、CUDA Toolkit、CUDNN和NVCC共同构成了NVIDIA GPU计算的核心框架。CUDA提供了并行计算的架构,CUDA Toolkit提供了开发工具,CUDNN为深度学习提供了优化的算法库,而NVCC则是将CUDA代码编译成GPU可执行文件的关键工具。理解这些组件及其关系,对于开发和优化GPU加速应用至关重要。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号