在Linux环境下使用CUDA进行开发,通常涉及以下几个基础概念:
__global__
关键字定义。以下是一个简单的CUDA例程,演示如何在GPU上执行向量加法:
首先,确保你的Linux系统已经安装了CUDA。可以从NVIDIA官网下载并安装适合你GPU型号的CUDA Toolkit。
创建一个名为vectorAdd.cu
的文件,内容如下:
#include <stdio.h>
#include <assert.h>
#include <cuda_runtime.h>
__global__ void vectorAdd(const float *A, const float *B, float *C, int numElements) {
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements) {
C[i] = A[i] + B[i];
}
}
int main(void) {
int numElements = 50000;
size_t size = numElements * sizeof(float);
float *h_A = (float *)malloc(size);
float *h_B = (float *)malloc(size);
float *h_C = (float *)malloc(size);
for (int i = 0; i < numElements; ++i) {
h_A[i] = rand() % 100;
h_B[i] = rand() % 100;
}
float *d_A, *d_B, *d_C;
cudaMalloc(&d_A, size);
cudaMalloc(&d_B, size);
cudaMalloc(&d_C, size);
cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
int threadsPerBlock = 256;
int blocksPerGrid = (numElements + threadsPerBlock - 1) / threadsPerBlock;
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);
cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
for (int i = 0; i < numElements; i++) {
assert(h_A[i] + h_B[i] == h_C[i]);
}
printf("Test PASSED\n");
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
free(h_A);
free(h_B);
free(h_C);
return 0;
}
使用nvcc
编译器编译CUDA代码:
nvcc vectorAdd.cu -o vectorAdd
运行编译后的二进制文件:
./vectorAdd
如果一切正常,你应该会看到输出Test PASSED
,表示向量加法在GPU上成功执行。
nvidia-smi
命令检查驱动和GPU状态。cudaMemGetInfo
函数检查可用内存。threadsPerBlock
和blocksPerGrid
的配置合理,避免超出GPU的资源限制。通过以上步骤,你应该能够在Linux环境下成功运行CUDA程序,并进行GPU加速计算。
领取专属 10元无门槛券
手把手带您无忧上云