CUDA常用函数介绍

cudaMalloc(void** p, int size):分配size字节的存储器,并将其首地址赋给*p,至于参数为什么是二级指针,可在C语言中找到答案

cudaMallocHost():这个方法是在主机上分配空间,可以加快传输速度,因此在写cuda时,应该使用此函数取代Malloc,参数同上一函数

cudaMemcpy(void* dest,void* source,int size,enum direction):copy size data form source to         dest,direction must be right,you must be careful。关于这个函数要注意的是:如果最后一个参数的类型不匹配也不会出错。

cudaMemcpyToSymbol:将数据复制到__constant__,__device__变量中
cudaMemcpyFormSymbol: 同上相反

CudaThreadSynchronize():强制等待所有在此句之前启动的runtime 任务完成。其实现方式采用的轮询。

__syncthreads():此函数用于保证block内所有线程都运行到调用处,常用它来保证一致性。

cudaMallocPitch(void**,int*,widthInBytes,height):这个函数是在线性内存中分配二维数组,因此在使用时,还是用一维的方式使用。注意,width的单位是字节,而height单位是数据类型,而第二个参数的含义下面一段话说明了。
c语言申请2维内存时,一般是连续存放的。a[y][x]存放在第y*widthofx*sizeof(元素)+x*sizeof(元素)个字节。 但在cuda的global memory访问中,从256字节对齐的地址(addr=0, 256, 512, ...)开始的连续访问是最有效率的。这样,为了提高内存访问的效率,有了cudaMallocPitch函数。cudaMallocPitch函数分配的内存中,数组的每一行的第一个元素的开始地址都保证是对齐的。因为每行有多少个数据是不确定的,widthofx*sizeof(元素)不一定是256的倍数。故此,为保证数组的每一行的第一个元素的开始地址对齐,cudaMallocPitch在分配内存时,每行会多分配一些字节,以保证widthofx*sizeof(元素)+多分配的字节是256的倍数(对齐)。这样,上面的y*widthofx*sizeof(元素)+x*sizeof(元素)来计算a[y][x]的地址就不正确了。 而应该是y*[widthofx*sizeof(元素)+多分配的字节]+x*sizeof(元素)。而函数中返回的pitch的值就是widthofx*sizeof(元素)+多分配的字节。 说明:widthInBytes作为输入参数,应该是widthofx*sizeof(元素);这样的话,复制内容时也要作相应的修改。

cuda中的数学函数,普通的和标准c中一样,如果是对int操作,直接使用本名,如果操作long类型对数,在本名前加l,如果操作双精度浮点数,在本名前加f,如果操作单精度,在本名前后都加上f,如 max(int,int),lmax(long,long),fmax(double,double),fmaxf(float,float),同时要记住的是:有些函数并没有某些类型参数存在,也就没有相应的函数。

向量操作

cuda对于向量在cutil_math.h中重载了很多操作符,如负号,+, -, *(包括矢量乘和数乘),/(向量的对应坐标相除和数除),+=,-=,*=,lerp(三个参数,含义为求一个值,使得该值和第一个参数的距离与每一个参数和第二个参数的距离的比值是第三个参数,类型于高中的线段的分割点), dot(点乘),length(返回二范数),normalize(对向量进行单位化),rsqrtf(求开方的倒数)

 

 

### 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); ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值