`

CUDA-流

    博客分类:
  • CUDA
阅读更多

 页锁定内存:

    cudaHostAlloc()分配页锁定内存,页锁定内存也称为固定内存或不可分页内存,它有一个重要的属性:操作系统将不会对这块内存分页并交换到磁盘上,从而确保了该内存始终驻留在物理内存中。

流:

    cuda流用于任务的并行。任务并行性是指并行执行两个或多个不同的任务,而不是在大量数据上执行同一个任务的数据并行性。比如处理同一副图,你用一个流处理左边半张图片,再用第二个流处理右边半张图片,这两个流中的代码同时执行,加快了处理速度。

示例:

#include <stdio.h>
#include <cuda_runtime.h>

#define N (1024*1024)
#define DATA_SIZE (N*20)

__global__ void add(int *a,int *b,int *c){
 int idx=threadIdx.x+blockIdx.x*blockDim.x;
 if(idx<N){
  int idx1=(idx+1)%256;
  int idx2=(idx+2)%256;
  float as=(a[idx]+a[idx1]+a[idx2])/3.0f;
  float bs=(b[idx]+b[idx1]+b[idx2])/3.0f;
  c[idx]=(as+bs)/2;
 }
}

int main(){

 cudaDeviceProp prop;
 int whichDevice;
 cudaGetDevice(&whichDevice);
 cudaGetDeviceProperties(&prop,whichDevice);
 if(!prop.deviceOverlap){
   printf("Device not overlap....");
   return 0;
 }

 int *a,*b,*c;
 int *a1,*b1,*c1;
 int *a_host,*b_host,*c_host;
 cudaEvent_t start,end;
 float elapsedTime;
 cudaEventCreate(&start);
 cudaEventCreate(&end);
 cudaEventRecord(start,0);

 cudaStream_t stream0,stream1;
 cudaStreamCreate(&stream0);
cudaStreamCreate(&stream1);

 cudaMalloc((void **)&a,N*sizeof(int));
 cudaMalloc((void **)&b,N*sizeof(int));
 cudaMalloc((void **)&c,N*sizeof(int));

 cudaMalloc((void **)&a1,N*sizeof(int));
 cudaMalloc((void **)&b1,N*sizeof(int));
 cudaMalloc((void **)&c1,N*sizeof(int));


 cudaHostAlloc((void **)&a_host,DATA_SIZE*sizeof(int),cudaHostAllocDefault);
 cudaHostAlloc((void **)&b_host,DATA_SIZE*sizeof(int),cudaHostAllocDefault);
 cudaHostAlloc((void **)&c_host,DATA_SIZE*sizeof(int),cudaHostAllocDefault);

 for(int i=0;i<DATA_SIZE;i++){
  a_host[i]=i;
  b_host[i]=i;
 }

 for(int i=0;i<DATA_SIZE;i+=N*2){
  cudaMemcpyAsync(a,a_host+i,N*sizeof(int),cudaMemcpyHostToDevice,stream0);
  cudaMemcpyAsync(a1,a_host+i+N,N*sizeof(int),cudaMemcpyHostToDevice,stream1);


  cudaMemcpyAsync(b,b_host+i,N*sizeof(int),cudaMemcpyHostToDevice,stream0);
  cudaMemcpyAsync(b1,b_host+i+N,N*sizeof(int),cudaMemcpyHostToDevice,stream1);

  add<<<N/256,256,0,stream0>>>(a,b,c);
  add<<<N/256,256,0,stream1>>>(a1,b1,c1);

  cudaMemcpyAsync(c_host+i,c,N*sizeof(int),cudaMemcpyDeviceToHost,stream0);
  cudaMemcpyAsync(c_host+i+N,c,N*sizeof(int),cudaMemcpyDeviceToHost,stream1);

 }

 cudaStreamSynchronize(stream0);
 cudaStreamSynchronize(stream1);
 cudaEventRecord(end,0);
 cudaEventSynchronize(end);

 cudaEventElapsedTime(&elapsedTime,start,end);
 printf("tie===%3.1f ms\n",elapsedTime);

 cudaFreeHost(a_host);
 cudaFreeHost(b_host);
 cudaFreeHost(c_host);
 cudaFree(a);
 cudaFree(b);
 cudaFree(c);
 cudaFree(a1);
 cudaFree(b1);
 cudaFree(c1);

 cudaStreamDestroy(stream0);
 cudaStreamDestroy(stream1);

return 0;
}

 注:硬件在处理内存复制和核函数执行时分别采用了不同的引擎,因此我们需要知道,将操作放入流中队列中的顺序将影响着CUDA驱动程序调度这些操作以及执行的方式。 因此在将操作放入流的队列时应该采用宽度优先方式,而非深度优先方式。

 

 

参考:《GPU高性能编程CUDA实战》

 

  • 大小: 3.3 MB
分享到:
评论

相关推荐

    CUDA-C 編程導讀

    - 在同步流函数`cudaStreamSynchronize()`的章节中提供了更多细节(3.2.6.5.2)。 - 讨论了NVIDIA SLI AFR模式下处理设备的新API调用(3.2.7.2, 3.3.10.2, 和4.3)。 - 添加了关于调用堆栈的章节(3.2.9 和 ...

    cuda-gdb.pdf

    调试者可以通过命令来检查程序的状态,比如查看内存和变量、观察纹理、使用info命令获取关于CUDA设备、流、瓦片、线程块、线程和上下文等的信息。 CUDA-GDB还允许用户在程序执行时进行单步执行,或者中断程序,这些...

    nvidia cuda-samples

    5. **流与依赖**:CUDA中的流(stream)和依赖管理是提高效率的关键。通过多流异步执行,可以最大化GPU的利用率,比如“concurrentKernels”示例。 6. **纹理和表面内存**:CUDA支持纹理和表面内存,这两种优化的...

    S4158-cuda-streams-best-practices-common-pitfalls.pdf

    CUDA流(Streams)是NVIDIA CUDA编程模型中的一个关键概念,它允许开发者更精细地控制GPU上的任务执行和数据传输,以实现并发执行和提升应用程序性能。在CUDA编程中,流表示一系列CUDA操作的执行顺序,这些操作可以...

    cuda-repo-ubuntu1404_7.5-18_amd64.deb

    根据提供的文件信息,我们可以推断出这是一份与CUDA(Compute Unified Device Architecture)相关的软件包。CUDA 是由 NVIDIA 开发的一种并行计算平台和技术模型,主要用于利用 NVIDIA 的 GPU 进行高性能计算。以下...

    Hands-On-GPU-Accelerated-Computer-Vision-with-OpenCV-and-CUDA-master.zip

    8. **优化技巧**:书中可能涵盖了如何调试CUDA代码,优化内存访问模式,减少数据传输,以及如何利用CUDA的流和事件来提高并发性能等高级主题。 通过学习这个压缩包中的内容,读者不仅可以掌握OpenCV和CUDA的基础...

    TensorRT-7.0.0.11.Ubuntu-16.04.x86_64-gnu.cuda-10.2.cudnn7.6

    在本案例中,我们讨论的是TensorRT 7.0.0.11版本,特别为Ubuntu 16.04 LTS操作系统、x86_64架构、CUDA 10.2工具包以及CUDNN 7.6.5设计的版本。这个压缩包`TensorRT-7.0.0.11.Ubuntu-16.04.x86_64-gnu.cuda-10.2....

    TensorRT-6.0.1.5.Ubuntu-18.04.x86_64-gnu.cuda-10.1.cudnn7.6.tar.gz

    这个压缩包“TensorRT-6.0.1.5.Ubuntu-18.04.x86_64-gnu.cuda-10.1.cudnn7.6.tar.gz”是专门为Ubuntu 18.04操作系统、x86_64架构、CUDA 10.1和CUDNN 7.6版本定制的TensorRT 6.0.1.5版本。 **TensorRT 6.0.1.5** ...

    cuda-9.2开发demo

    6. simpleKernel:此示例可能包含更复杂的CUDA内核编程技术,比如动态并行ism、流控制、原子操作等,这些是编写复杂CUDA程序的基础。 7. advanced:最后的7系列示例通常会包含更高级的CUDA编程技巧,比如错误检查、...

    学习利用CUDA10编程 Learning-CUDA-10-Programming-master.zip

    4. **CUDA流和事件**:CUDA流用于异步执行任务,可以提高资源利用率。事件则用来度量不同操作的执行时间,对性能分析和优化很有帮助。 5. **CUBLAS和cuFFT**:CUBLAS是CUDA的BLAS(基础线性代数子程序)库,提供了...

    CUDA-By-Example里的Julia修复包(patched)

    1. **CUDA架构**:CUDA架构是由GPU的流处理器(Streaming Multiprocessors, SMs)和线程块(Thread Blocks)组成的。线程块内的线程进一步组织为线程网格(Thread Grids)。这种分层结构使得大规模并行计算成为可能...

    GPU-Z+CPU-Z+CUDA-Z Z家族软件

    CUDA-Z可以显示GPU的CUDA核心数量、流处理器单元、带宽等关键信息,并且可以监控GPU的CUDA活动和内存使用情况。这对于进行GPU计算开发,尤其是深度学习、科学计算和图形渲染等领域的人来说非常有用。 这三款软件合...

    An Introduction to CUDA-OpenCL and Graphics Processors

    例如,NVIDIA 的 Kepler 架构就具有 15 个流多处理器(SM),每个 SM 都有 6 个 issue unit 和 32 个 way SIMD。 Latency Optimized CPU CPU 的架构则是为了追求低延迟而设计的。CPU 的处理单元都是为串行任务而...

    torch-cuda-cu

    4. **优化策略**:使用`torch.cuda.synchronize()`确保所有GPU操作完成后再进行下一步,或者使用流(stream)进行异步计算,提高效率。 总结来说,"torch-cuda-cu"与PyTorch在CUDA环境下的高效计算密切相关,它封装...

    cuda-api-wrappers:CUDA运行时API的薄C ++风味包装器

    使用cuda-api-wrappers,您仍然可以拥有设备,流,事件等-但它们将以更多的C ++惯用方式更加方便地使用。主要特征所有函数和方法都会在失败时引发异常-无需检查返回值(异常带有状态信息)。 明智的命名空间(以及...

    PyPI 官网下载 | dask-cuda-21.12.0a211208.tar.gz

    2. **CUDA 协程**:该库利用 CUDA 的流和事件机制,优化了 GPU 上的任务调度,确保高效利用硬件资源。 3. **异构计算**:Dask-CUDA 支持在 CPU 和 GPU 之间进行数据转移,允许混合使用 CPU 和 GPU 计算,优化整体...

    cuda-wrapper:Nvidia CUDA库的C ++包装器

    流 大事记 符号 使用纹理对象API的纹理 要求 CUDA≥7.0支持 C ++ 11编译器 CMake≥2.8.12 安装 cuda-wrapper使用CMake,标头仅安装到CMake指定的目录中: $ cmake path/to/cuda-wrapper $ make $ make

    Hands-On-GPU-Programming-with-Python-and-CUDA-master.zip

    理解如何使用流和事件来最大限度地提高GPU的利用率。 8. **应用实例**:通过实际案例,如图像处理、数值计算和机器学习,展示CUDA在各个领域的应用。学习如何将CUDA应用于这些场景,提升计算速度。 9. **错误处理...

    Python库 | dask_cuda-22.2.0a211123-py3-none-any.whl

    2. **数据流与任务调度**:它结合Dask的并行任务调度器,将工作负载分割成小任务,分配到各个GPU上执行。 3. **GPU DataFrame**:提供了`Dask cuDF`,这是一个基于Apache Arrow的GPU数据结构,允许快速处理大规模...

    2019.04新版64位nVIDIA显卡CUDA性能测试工具,可测试nVIDIA显卡的参数,CUDA浮点运算性能

    这些内核可以在成千上万个流处理器(Streaming Multiprocessors, SMs)上同时运行,极大地提高了计算效率。CUDA编程模型包括线程块(Thread Blocks)、线程网格(Thread Grids)和共享内存等关键概念,这些都设计...

Global site tag (gtag.js) - Google Analytics