当使用CUDA(Compute Unified Device Architecture)进行并行计算时,我们可以利用GPU(图形处理器)的强大性能来加速各种应用程序。
下面演示一下用cuda在GPU上执行向量加法:
// vector_add.cu
#include <stdio.h>
// CUDA核函数,用于在GPU上执行向量加法
__global__ void vectorAdd(int *a, int *b, int *c, int size) {
// 获取当前线程的索引
int tid = blockIdx.x * blockDim.x + threadIdx.x;
// 确保线程索引在向量大小范围内
if (tid < size) {
// 计算向量元素相加结果
c[tid] = a[tid] + b[tid];
}
}
int main() {
int size = 1000;
int a[size], b[size], c[size];
// 在设备上分配内存空间
int *dev_a, *dev_b, *dev_c;
cudaMalloc((void**)&dev_a, size * sizeof(int));
cudaMalloc((void**)&dev_b, size * sizeof(int));
cudaMalloc((void**)&dev_c, size * sizeof(int));
// 初始化输入向量 a 和 b
for (int i = 0; i < size; ++i) {
a[i] = i;
b[i] = i * 2;
}
// 将输入向量 a 和 b 复制到设备内存
cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
// 定义每个块中的线程数和块数
int threadsPerBlock = 256;
int blocksPerGrid = (size + threadsPerBlock - 1) / threadsPerBlock;
// 调用 CUDA 核函数执行向量加法
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(dev_a, dev_b, dev_c, size);
// 将计算结果从设备复制到主机内存
cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
// 打印结果向量 c 的前10个元素
for (int i = 0; i < 10; ++i) {
printf("%d ", c[i]);
}
printf("\n");
// 释放设备上的内存空间
cudaFree(dev_a);
cudaFree(dev_b);
cudaFree(dev_c);
return 0;
}
例程中,首先在主机内存中定义输入向量 a 和 b,并分配设备内存空间来存储输入和输出向量。然后,使用 cudaMemcpy
函数将输入向量从主机内存复制到设备内存。
接下来,定义了每个块中的线程数和块数,并调用了CUDA核函数 vectorAdd
来执行向量加法。该核函数使用线程索引来确定每个线程要处理的向量元素,并将加法结果存储在输出向量 c 中。
最后,使用 cudaMemcpy
函数将输出向量从设备内存复制回主机内存,并打印输出向量的前10个元素。最后,释放在设备上分配的内存空间。
用NVCC编译器编译cu程序:nvcc vector_add.cu -o vector_add
在大型C++程序中,可以使用CUDA来加速特定的计算任务。下面演示一个程序:
// main.cpp
// 包含必要的头文件和声明CUDA函数
#include <iostream>
// CUDA函数声明
extern "C" void cudaFunction();
int main() {
std::cout << "Running C++ code..." << std::endl;
// 调用CUDA函数
cudaFunction();
std::cout << "C++ code completed." << std::endl;
return 0;
}
// cuda_code.cu
#include <stdio.h>
// CUDA函数定义
__global__ void kernelFunction() {
printf("Running CUDA code...\n");
}
extern "C" void cudaFunction() {
// 设置GPU设备并在设备上执行CUDA核函数
cudaSetDevice(0);
// cuda_kernel<<<nBlock,nThread>>>();
kernelFunction<<<1, 1>>>();
cudaDeviceSynchronize();
}
编译步骤如下:
nvcc -c cuda_code.cu -o cuda_code.o
g++ -c main.cpp -o main.o
g++ cuda_code.o main.o -o cuda_cpp -lcudart -L/usr/local/cuda/lib64
这样,就可以将CUDA函数嵌入到C++程序中,并在运行时通过调用C++代码来触发CUDA函数的执行。