cuda学习笔记(1)

本文详细介绍了CUDA并行计算的基本流程,包括如何定义核函数、使用blocksPerGrid和threadsPerBlock参数来控制线程和块的数量,以及如何通过cudaMalloc、cudaMemcpy和cudaFree等API进行GPU内存管理。并通过一个简单的加法运算示例,展示了如何在CPU代码中调用GPU进行并行计算。
摘要由CSDN通过智能技术生成

1.基本流程

cuda代码(.cu)的目的是并行运算。只要在c/c++代码中调用以 __ global__为关键字修饰的函数( __ global __ void function( type *InputArrayA, type *InputArrayB, type *OutputArrayA) ),称为核函数,代码经nvcc编译,识别到核函数就会编译成gpu指令码; 调用该函数时,要在函数名称加上 <<<blocksPerGrid, threadsPerBlock>>> ( function<<<blocksPerGrid, threadsPerBlock>>>( type *InputArrayA, type *InputArrayB, type *OutputArrayA) )。不过,gpu 只能操作gpu上的变量,所以在调用 __ global __ 函数之前,先用 cudaMalloc 申请好在cuda变量内存(__global函数的参数:input array,output array),并用 cudaMemcpy (cudaMemcpyHostToDevice) 赋值输入array。待函数执行完成后,执行结果保存在输出array中,用 cudaMemcpy (cudaMemcpyDeviceToHost) 把执行结果从gpu内存中copy到cpu中,并行计算完成,用 cudaFree 释放之前申请的cuda变量内存。 以上就是cpu代码中调用gpu的流程。

1.1 blocksPerGrid, threadsPerBlock 说明

cuda 结构
调用 cuda 核函数需要指定调用多少个block,每个block包含多少个thread。其中,多个block组成一个 grid . 共调用了 blocksPerGrid*threadsPerBlock 个并行执行的线程,所以要在cuda核函数中明确的指定每个线程执行时对应的array index。注意:thread, block有.x, .y二维数据,但有时只用其中一维.x 。下面将给出一个简单的demo,执行 C=A+B ( c[i] = a[i] + b[i] )运算。

example1: naive_add.cu

#include "../common/book.h"

#define N   10

__global__ void add( int *a, int *b, int *c ) 
{
    int tid = blockIdx.x;    // this thread handles the data at its thread id
    if (tid < N)
        c[tid] = a[tid] + b[tid];
}

int main( void ) 
{
    int a[N], b[N], c[N];
    int *dev_a, *dev_b, *dev_c;

    // allocate the memory on the GPU
    HANDLE_ERROR( cudaMalloc( (void**)&dev_a, N * sizeof(int) ) );
    HANDLE_ERROR( cudaMalloc( (void**)&dev_b, N * sizeof(int) ) );
    HANDLE_ERROR( cudaMalloc( (void**)&dev_c, N * sizeof(int) ) );

    // fill the arrays 'a' and 'b' on the CPU
    for (int i=0; i<N; i++) 
    {
        a[i] = -i;
        b[i] = i * i;
    }

    // copy the arrays 'a' and 'b' to the GPU
    HANDLE_ERROR( cudaMemcpy( dev_a, a, N * sizeof(int),
                              cudaMemcpyHostToDevice ) );
    HANDLE_ERROR( cudaMemcpy( dev_b, b, N * sizeof(int),
                              cudaMemcpyHostToDevice ) );
    //N blocks, 1 thread per block for N length arrays parallel computation(add)
    add<<<N,1>>>( dev_a, dev_b, dev_c );

    // copy the array 'c' back from the GPU to the CPU
    HANDLE_ERROR( cudaMemcpy( c, dev_c, N * sizeof(int),
                              cudaMemcpyDeviceToHost ) );

    // display the results
    for (int i=0; i<N; i++)
    {
        printf( "%d + %d = %d\n", a[i], b[i], c[i] );
    }

    // free the memory allocated on the GPU
    HANDLE_ERROR( cudaFree( dev_a ) );
    HANDLE_ERROR( cudaFree( dev_b ) );
    HANDLE_ERROR( cudaFree( dev_c ) );

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值