溫馨提示×

Ubuntu下C++如何利用GPU加速計算

小樊
51
2025-07-22 10:04:26
欄目: 編程語言

在Ubuntu下,使用C++進行GPU加速計算通常涉及以下幾個步驟:

  1. 選擇GPU加速庫

    • CUDA:由NVIDIA提供,適用于NVIDIA GPU。
    • OpenCL:跨平臺,適用于多種GPU和CPU。
    • ROCm:由AMD提供,適用于AMD GPU。
  2. 安裝GPU加速庫

    • 對于CUDA,可以從NVIDIA官網下載并安裝CUDA Toolkit。
    • 對于OpenCL,Ubuntu通常預裝了OpenCL驅動和庫,但可能需要安裝額外的開發包。
    • 對于ROCm,可以從AMD官網下載并安裝ROCm軟件棧。
  3. 編寫C++代碼

    • 使用所選庫提供的API編寫GPU加速的C++代碼。
    • 通常需要將計算密集型任務轉移到GPU上執行,并將結果傳回CPU。
  4. 編譯和運行

    • 使用適當的編譯器標志和庫鏈接選項來編譯C++代碼。
    • 運行生成的可執行文件以執行GPU加速計算。

以下是一個簡單的示例,展示如何使用CUDA在Ubuntu下使用C++進行GPU加速計算:

安裝CUDA Toolkit

  1. 下載CUDA Toolkit:

    wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/cuda_11.4.2_460.32.03_linux.run
    
  2. 運行安裝程序:

    sudo sh cuda_11.4.2_460.32.03_linux.run
    
  3. 按照提示完成安裝,并設置環境變量:

    echo 'export PATH=/usr/local/cuda-11.4/bin:$PATH' >> ~/.bashrc
    echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.4/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
    source ~/.bashrc
    

編寫CUDA C++代碼

創建一個名為vector_add.cu的文件,內容如下:

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

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

int main() {
    int numElements = 256;
    size_t size = numElements * sizeof(float);
    float *h_A, *h_B, *h_C;
    float *d_A, *d_B, *d_C;

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

    // Initialize host memory
    for (int i = 0; i < numElements; ++i) {
        h_A[i] = rand() / (float)RAND_MAX;
        h_B[i] = rand() / (float)RAND_MAX;
    }

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

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

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

    // Copy result back to host memory
    cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);

    // Verify the result
    for (int i = 0; i < numElements; ++i) {
        if (fabs(h_A[i] + h_B[i] - h_C[i]) > 1e-5) {
            std::cerr << "Result verification failed at element "<< i << std::endl;
            exit(EXIT_FAILURE);
        }
    }

    std::cout << "Test PASSED" << std::endl;

    // Free device memory
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    // Free host memory
    free(h_A);
    free(h_B);
    free(h_C);

    return 0;
}

編譯和運行

使用nvcc編譯器編譯代碼:

nvcc vector_add.cu -o vector_add

運行生成的可執行文件:

./vector_add

這個示例展示了如何使用CUDA在Ubuntu下使用C++進行GPU加速計算。你可以根據具體需求調整代碼和編譯選項。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女