😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍cuda入门。
学其所用,用其所学。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞
文章目录
- :smirk:1. cuda并行编程介绍
- :blush:2. cuda向量加法示例
- :satisfied:3. 将cuda高性能运算嵌入c++程序
😏1. cuda并行编程介绍
当使用CUDA(Compute Unified Device Architecture)进行并行计算时,我们可以利用GPU(图形处理器)的强大性能来加速各种应用程序。
😊2. cuda向量加法示例
下面演示一下用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 和 bfor (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
😆3. 将cuda高性能运算嵌入c++程序
在大型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函数的执行。
以上。