Linux Mint 22 虚拟机安装 CUDA Toolkit

本机没有 NVIDIA GPU,只是无聊想要试试能不能在没有 GPU 的机器(宿主机没 GPU)上做编译工作

按照 官网链接,选择 Ubuntu 即可。cuda-repo-ubuntu2404-12-6-local_12.6.1-560.35.03-1_amd64.deb 这个文件占了 3.2G,安装之后就更大了。

安装完成之后,可以在 /usr/local/cuda-12.6/bin/ 中找到 nvcc。加到 PATH 之后,编译都能正常进行,但是因为没有 GPU,运行时 CUDA 相关的 API 都会报错,仅此而已。

#include <iostream>

// https://leimao.github.io/blog/Proper-CUDA-Error-Checking/
#define CHECK_CUDA_ERROR(val) check((val), #val, __FILE__, __LINE__)
void check(cudaError_t err, const char* const func, const char* const file,
           const int line)
{
    if (err != cudaSuccess)
    {
        std::cerr << "CUDA Runtime Error at: " << file << ":" << line
                  << std::endl;
        std::cerr << cudaGetErrorString(err) << " " << func << std::endl;
        // We don't exit when we encounter CUDA errors in this example.
        // std::exit(EXIT_FAILURE);
    }
}

#define CHECK_LAST_CUDA_ERROR() checkLast(__FILE__, __LINE__)
void checkLast(const char* const file, const int line)
{
    cudaError_t const err{cudaGetLastError()};
    if (err != cudaSuccess)
    {
        std::cerr << "CUDA Runtime Error at: " << file << ":" << line
                  << std::endl;
        std::cerr << cudaGetErrorString(err) << std::endl;
        // We don't exit when we encounter CUDA errors in this example.
        // std::exit(EXIT_FAILURE);
    }
}

__global__ void calc(int n, float *x, float *y) {
    for (int i = 0; i < n; ++i) {
        *x += *y;
    }
}

int main() {
    constexpr int n = 10;
    float *x, *y;
    CHECK_CUDA_ERROR(cudaMalloc(&x, n * sizeof(float)));
    CHECK_CUDA_ERROR(cudaMalloc(&y, n * sizeof(float)));
    // 懒得初始化了
    calc<<<1, 1>>>(n, x, y);
    CHECK_LAST_CUDA_ERROR();
    CHECK_CUDA_ERROR(cudaFree(x));
    CHECK_CUDA_ERROR(cudaFree(y));
}

输出:

CUDA Runtime Error at: main.cu:42
CUDA driver version is insufficient for CUDA runtime version cudaMalloc(&x, n * sizeof(float))
CUDA Runtime Error at: main.cu:43
CUDA driver version is insufficient for CUDA runtime version cudaMalloc(&y, n * sizeof(float))
CUDA Runtime Error at: main.cu:45
CUDA driver version is insufficient for CUDA runtime version
CUDA Runtime Error at: main.cu:46
CUDA driver version is insufficient for CUDA runtime version cudaFree(x)
CUDA Runtime Error at: main.cu:47
CUDA driver version is insufficient for CUDA runtime version cudaFree(y)