用cuda实现对较大内存数据的并行处理

刚刚学cuda的时候以为调用核函数的时候可以开辟任意大小的线程,所以当自己尝试用cuda实现卷积运算的时候,调用核函数的时候用了这样的写法cudaConv<<<1,memSize>>>(gpuMem);
实际上cuda每个block的线程数是有上限的。
下面这个知乎答案说明了怎样获取cuda可开辟的最大线程数。
https://www.zhihu.com/question/462801801/answer/1925184931
当需要开辟多于maxThreadsPerBlock个线程的时候,需要在调用核函数的时候配合block使用。
下面是一个具体的调用例子,实现对一个数组的每一位数字实现+1操作。

#include<iostream>

//传入的第2个参数表示数据的个数
__global__ void bigMatAdd(int* gpuMem,unsigned int dataSize)
{
    //当前位置的线程标号
    int thrId=threadIdx.x;
    //当前位置的线程块标号
    int blkId=blockIdx.x;
    //当前线程需要操作的位置
    int dstLocal=blkId*blockDim.x+thrId;
    //判断线程操作位置是否超过了范围
    if(dstLocal<dataSize)
    {
        //对目标内存做操作
        gpuMem[dstLocal]+=1;
    }
}

int main()
{
    //数据的大小
    const unsigned int dataSize=4000*1000;
    const unsigned int threadSize=1000;
    //新建相应大小的cpu数据
    unsigned char cpuData[dataSize];
    //对所有的cpu数据依次赋值
    for(int i=0;i<dataSize;++i) cpuData[i]=10;
    //定义gpu数据
    int* gpuData;
    //开辟gpu数据的空间
    cudaMalloc((void**)&gpuData,sizeof(int)*dataSize);
    //把cpu数据复制到gpu里面
    cudaMemcpy(gpuData,cpuData,sizeof(int)*dataSize,cudaMemcpyHostToDevice);
    //调用核函数
    bigMatAdd<<<dataSize/threadSize+1,threadSize>>>(gpuData,dataSize);
    //把gpu里面的数据复制到cpu里面
    cudaMemcpy(cpuData,gpuData,sizeof(int)*dataSize,cudaMemcpyDeviceToHost);
    //遍历复制后的cpu数据,检测它们的数据是否都正常
    for(int i=0;i<dataSize;++i)
    {
        if(cpuData[i]!=11)
        {
            std::cout<<cpuData[i]<<std::endl;
            break;
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CUDA(Compute Unified Device Architecture)是NVIDIA公司推出的一种并行计算平台和编程模型,专为GPU(Graphics Processing Unit)设计,旨在利用GPU的强大浮点运算能力和大规模并行处理能力,加速科学计算、机器学习、深度学习等高性能计算任务。 在CUDA中,实现并行处理主要包括以下几个关键概念: 1. **CUDA编程模型**:CUDA使用C/C++语言编写,并引入了CUDA C++ API,提供了一套称为`kernel`的函数,这些函数在GPU上并行执行。程序员通过数据并行的方式,将大量的任务分解成小任务分发到每个GPU的核心上。 2. **线程块(Thread Blocks)**:一组执行相同代码的线程组成一个线程块,线程块可以在同一时间在一个或多个CUDA核心上并发执行。 3. **线程(Threads)**:CUDA的核心思想是并行化,每个线程代表一个小任务,线程的调度和管理由CUDA自动完成。 4. **共享内存(Shared Memory)**:线程块内的线程可以访问共享内存,这是一种快速的全局内存,用于存储临时数据,减少与主机内存的交换,提高性能。 5. **全局内存(Global Memory)**:所有线程都可以访问全局内存,但访问速度相对较慢,主要用于存储较大数据集。 6. **纹理内存(Texture Memory)**:适合于读取大量重复的数据,如图像数据,提供了高效的读取模式。 7. **同步(Synchronization)**:为了保证程序的正确性,CUDA支持同步操作,如`__syncthreads()`函数,用于控制线程间的执行顺序。 8. **CUDA流(CUDA Streams)**:可以并发执行多个计算任务,提高了任务调度的灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值