cuda编程002—流

没有使用同步的情况:

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

__global__ void test_kernel(){

    printf("Message from Device.\n");
}
void test(){
    test_kernel<<<1, 1>>>();
}
#include <cuda_runtime.h>
#include <stdio.h>


void test();
int main(){
    
    test();
    printf("Message from Host.\n");

    getchar();

    return 0;
}

先调用的核函数,结果是先输出的Host:

 进行同步,代码如下:

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


void test();
int main(){
    
    test();
    // cudaDeviceSynchronize();  // 设备同步,整个GPU设备的同步等待任务完成
    cudaStreamSynchronize(nullptr);  // 流同步
    printf("Message from Host.\n");

    getchar();

    return 0;
}

输出结果:

cuda流整体笔记和代码

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

// 核函数
__global__ void test_kernel(float* array, int edge){

    int position = blockDim.x * blockIdx.x + threadIdx.x;
    if(position >= edge) return;

    array[position] *= 0.5f;
}

void test(cudaStream_t stream, float* array, int num){

    int threads = 512;
    int blocks = ceil(num / (float)threads);
    test_kernel<<<blocks, threads, 0, stream>>>(array, num);
}
#include <cuda_runtime.h>
#include <stdio.h>

// C++ 文件
void test(cudaStream_t stream, float* array, int num);

int main(){
    
    cudaStream_t stream;
    cudaEvent_t start, stop;

    // cudaEvent 是事件, 通常可以用来观察队列的执行情况
    // 比如,统计执行时间等操作
    cudaEventCreate(&start);
    cudaEventCreate(&stop);

    // 是重操作,不要随便创建太多,会消耗资源的
    // GPU计算的基本原则,是尽可能的使得计算密集,如果使用同步的话就是算一坨,等一会儿,算一坨,等一会。费劲吧啦的
    // 通过stream使得计算连续化、密集化,这样最好
    // GPU有个使用率,跟CPU使用了一样的,以GPU使用率越高越好
    cudaStreamCreate(&stream);

    cudaEventRecord(start, stream);

    int num = 10000;
    float* a = new float[num];
    for(int i=0; i < num; ++i)
        a[i] = i;

    float* a_device = nullptr;
    size_t a_bytes = sizeof(float) * num;
    cudaMalloc(&a_device, a_bytes);

    // 异步依赖的指针数据,必须在执行完成前一直存在,否则会造成例外结果
    // 并且异步执行时,对指针数据的修改,也需要合理的理解
    cudaMemcpyAsync(a_device, a, a_bytes, cudaMemcpyHostToDevice, stream);

    // 如果异步复制加上下面这段代码。会导致GPU边复制,CPU边修改,结果是a_device的内容不可控
    // 因此不要这么做,或者合理的去做你想做的
    // for(int i=0; i < num; ++i)
    //      a[i] = 500-i;


    test(stream, a_device, num);
    cudaMemcpyAsync(a, a_device, a_bytes, cudaMemcpyDeviceToHost, stream);

    cudaEventRecord(stop, stream);
    cudaEventSynchronize(stop);

    float ms = 0;
    cudaEventElapsedTime(&ms, start, stop);
    printf("核的执行时间是:%.8f ms\n", ms);

    // 打印前10个结果
    for(int i = 0; i < 10; ++i){
        printf(i == 0 ? "%.2f" : ", %.2f", a[i]);
    }
    printf("\n");
    
    // cudaStreamSynchronize(stream);
    // cudaDeviceSynchronize();  // 设备同步,整个GPU设备的同步等待任务完成
    // cudaStreamSynchronize(nullptr);  // 流同步

    /* 流的概率,stream, 类型全称是cudaStream_t
    1. 认为流是一个线程,任务级别的线程
    2. 认为流是一个任务队列
    3. 把异步执行的任务管理起来,在需要的时候等待或者做更多处理
    4. 默认流,指nullptr,如果给定为nullptr,就会使用默认流

    cuda核的执行都是异步的, 通过流来实现需要的同步

    任务队列
    队列特性:先进先出,后进后出

    cudaMemcpy 属于同步版本的内存拷贝
        等价于干了  ->  发送指令(任务队列中增加一个任务),我要复制了, cudaMemcpyAsync
                  ->  等待复制完成,cudaDeviceSynchronize

    */
    printf("Message from Host.\n");

    // 符合栈的方式分配和释放,就不用担心有bug
    delete [] a;
    
    cudaFree(a_device);
    cudaStreamDestroy(stream);
    cudaEventDestroy(start);
    cudaEventDestroy(stop);

    // getchar();

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CUDA编程指南8.0中文版本是一份详细的关于基于NVIDIA GPU的CUDA编程的指南。它由NVIDIA公司编写,为初学者以及有经验的CUDA程序员提供了重要的参考和指导。 此指南涵盖了各种主题,包括基础的CUDA编程概念,数据并行性、控制、共享内存、纹理内存等,并且提供了很多实例代码,从而使读者能够更好地理解这些概念。 在本指南中,读者将学习如何使用CUDA C/C++进行GPU编程,并了解如何构建高性能、高效的GPU应用程序。该指南还介绍了NVIDIA CUDA平台和构建CUDA代码的过程,并提供了许多常用的编程技巧和最佳实践的指导。 其中,8.0版本相较于之前的版本,更充分地考虑了Pascal GPU架构,支持全新的CUDA8.0特性,如无符号整型原子操作、可扩展的每线程等等。 总之,该指南是CUDA编程的权威指南,对于想要快速学习CUDA编程以及对GPU加速有兴趣的程序员来说,是一份难得的学习材料。 ### 回答2: CUDA编程指南8.0中文是一本介绍CUDA编程的书籍,由NVIDIA公司出版。CUDA是一种使用GPU进行并行计算的编程模型,可以极大地提高计算效率。本书详细介绍了CUDA编程的基本概念、语法、编程技巧、优化方法等内容,涵盖了从入门到进阶的全系列内容。 本书的前半部分介绍了CUDA编程的基本概念和语法,通过讲解线程、线程块、网格等概念,帮助读者建立起对CUDA编程的直观认识。同时,本书也详细讲解了CUDA的数据类型、内存管理、设备函数、共享内存、纹理内存等重要概念,使读者能够熟练运用这些技术解决实际问题。 本书的后半部分介绍了如何使用CUDA进行优化,包括并行算法、性能分析、调试技巧、内存优化、分布式编程等内容。这些内容对于那些希望将CUDA运用于实际应用中的开发者来说非常有用,能够帮助他们更好地利用GPU的性能优势,提高应用程序的执行效率。 总的来说,CUDA编程指南8.0中文是一本非常实用的CUDA编程教材,是学习CUDA编程必不可少的参考资料。对于那些希望了解CUDA编程并能够自行编写CUDA程序的人来说,这本书绝对是最佳的选择。 ### 回答3: CUDA编程指南8.0中文版是为了帮助开发人员更好地了解CUDA程序设计而编写的一本指南。该指南介绍的主要是基于NVIDIA GPU加速计算的相关知识,目的是让开发人员可以利用GPU提高计算效率、加速计算速度,从而为科学计算和工业应用等领域带来更高的性能和效率。 这本指南包括了CUDA的基础概念,包括线程、块、网格、共享内存、纹理内存、原子操作等,以及CUDA 8.0引入的新功能,如CUDA Runtime API、CUDA Graph、共享内存优化等。此外,指南还通过丰富的代码示例,展示了如何使用CUDA来开发高效的并行计算程序。它还介绍了如何使用CUDA工具来调试和优化CUDA程序,包括CUDA统计分析器、CUDA线程检查器和CUDA延迟检查器等。 除了指南本身外,CUDA编程指南8.0中文版还提供了很多配套资源,包括代码示例、编程工具和CUDA加速库等,这些资源可让开发人员更快地掌握CUDA编程技巧和应用方法。 总之,CUDA编程指南8.0中文版是一本非常有价值的指南,它提供了丰富的理论和实践知识,帮助开发人员更好地理解和应用CUDA程序设计的能力,从而更好地利用GPU加速计算。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值