### CUDA 常用函数及其功能
CUDA 是一种并行计算平台和编程模型,允许开发者利用 NVIDIA GPU 的强大性能来加速应用程序。以下是 CUDA 中一些常见的 API 函数以及它们的功能描述:
#### 1. `cudaMalloc` 和 `cudaFree`
用于分配和释放设备内存。
- **`cudaMalloc(void** devPtr, size_t size)`**: 在设备上分配指定大小的内存空间,并返回指向该内存区域的指针[^3]。
- **`cudaFree(void* devPtr)`**: 释放之前通过 `cudaMalloc` 分配的设备内存。
```c++
float *d_a;
cudaMalloc((void**)&d_a, N * sizeof(float)); // 分配N个浮点数的空间
// 使用完毕后释放内存
cudaFree(d_a);
```
---
#### 2. ` cudaMemcpy `
实现主机与设备之间的数据传输。
- **`cudaMemcpy(void* dst, const void* src, size_t count, cudaMemcpyKind kind)`**: 将数据从源地址复制到目标地址,支持不同方向的数据传输(如 HostToDevice 或 DeviceToHost)[^4]。
| 参数 | 描述 |
|------|------|
| `dst` | 数据的目标地址 |
| `src` | 数据的源地址 |
| `count` | 要复制的字节数 |
| `kind` | 复制的方向 |
```c++
float h_data[N]; // 主机上的数组
float *d_data; // 设备上的数组
cudaMalloc(&d_data, N * sizeof(float));
cudaMemcpy(d_data, h_data, N * sizeof(float), cudaMemcpyHostToDevice); // 主机到设备
```
---
#### 3. ` cudaMemset `
初始化设备内存为特定值。
- **`cudaMemset(void* devPtr, int value, size_t count)`**: 将设备内存设置为给定的整数值[^5]。
```c++
int init_val = 0;
cudaMemset(d_data, init_val, N * sizeof(float)); // 初始化 d_data 数组为全零
```
---
#### 4. ` cudaStreamCreate `, ` cudaStreamDestroy `, and ` cudaLaunchKernel `
管理流和异步操作。
- **`cudaStreamCreate(cudaStream_t* stream)`**: 创建一个新的 CUDA 流对象[^6]。
- **`cudaStreamDestroy(cudaStream_t stream)`**: 销毁已创建的流对象。
- **`cudaLaunchKernel(const void* func, dim3 gridDim, dim3 blockDim, void** args, size_t sharedMem, cudaStream_t stream)`**: 启动一个内核函数执行实例。
```cpp
dim3 block(256); // 每个线程块包含256个线程
dim3 grid(N / 256 + 1); // 计算所需的网格尺寸
my_kernel<<<grid, block>>>(d_data, N); // 同步调用
```
---
#### 5. ` cudaEventRecord ` 和 ` cudaEventSynchronize `
记录事件以测量时间间隔。
- **`cudaEventRecord(cudaEvent_t event, cudaStream_t stream = 0)`**: 在当前流中标记某个时刻的时间戳[^7]。
- **`cudaEventSynchronize(cudaEvent_t event)`**: 阻塞 CPU 直至指定事件完成。
```cpp
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start, 0);
kernel_function<<<blocks, threads>>>(data_d);
cudaEventRecord(stop, 0);
float elapsed_time_ms;
cudaEventElapsedTime(&elapsed_time_ms, start, stop);
printf("Execution time: %f ms\n", elapsed_time_ms);
```
---
#### 6. ` cuBLAS ` 库接口
cuBLAS 提供了高效的 BLAS(Basic Linear Algebra Subprograms)库实现,适用于矩阵运算。
- **`cublasHandle_t handle`**: 创建和销毁句柄。
- **`cublasSgemm(handle, transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc)`**: 执行通用矩阵乘法 \(C = \alpha AB + \beta C\)。
```cpp
#include <cublas_v2.h>
cublasHandle_t handle;
cublasCreate(&handle);
const float alpha = 1.f, beta = 0.f;
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N,
M, N, K, &alpha, d_A, M, d_B, K, &beta, d_C, M);
```
---
#### 7. ` curandGenerateUniform ` 和其他随机数生成器
curand 提供了一套强大的伪随机数生成工具。
- **`curandGenerator_t generator`**: 创建随机数生成器。
- **`curandGenerateUniform(generator, results_d, num_results)`**: 生成均匀分布的随机数序列[^8]。
```cpp
curandGenerator_t gen;
curandCreateGenerator(&gen, CURAND_RNG_PSEUDO_DEFAULT);
curandSetPseudoRandomGeneratorSeed(gen, unsigned(time(NULL)));
curandGenerateUniform(gen, d_randoms, N);
```
---