精华内容
下载资源
问答
  • GPU编程

    2017-10-19 15:47:00
    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。 目录 《GPU编程自学1 —— 引言》 《GPU编程自学2 —— CUDA环境配置》 《GPU编程自学3 —— CUDA...

    转载http://blog.csdn.net/shuzfan/article/category/7072956

     

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。

    目录

    一、 引言

    传统的中央处理器(CPU,Central Processing Unit) 内部结构异常复杂,主要是因为其需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。 为了提高计算能力,CPU通常会采取提高时钟频率或增加处理器核数量的策略。

    为了进一步获得更高效的计算,图形处理器(GPU, Graphics Processing Unit)应运而生。 GPU可以在无需中断的纯净环境下处理类型高度统一的、相互无依赖的大规模数据。

    如下图所示: 
    float

    GPU的高效在于可以高度并行处理。 以两个向量相加为例,CPU可能采取循环处理,每个循环对一个分量做加法。GPU则可以开多个线程,每个线程同时对一个分量做加法。CPU加法的速度一般快于GPU,但因为GPU可以同时开大量线程并行跑,因此更加高效。

    为了降低GPU程序的开发难度,NVIDIA推出了 CUDA(Compute Unified Device Architecture,统一计算设备架构)这一编程模型。

    参考链接:

      1. CPU和GPU的区别是什么?https://www.zhihu.com/question/19903344
      2. 百度百科CUDA https://baike.baidu.com/item/CUDA
      3. 《CUDA by Example: An Introduction to General-Purpose GPU Programming》 中文名《GPU高性能编程CUDA实战》

    转载于:https://www.cnblogs.com/mrxsc/articles/7692892.html

    展开全文
  • GPU精粹3GPU编程

    2019-07-22 19:05:01
    资源名称:GPU精粹3 GPU编程资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
  • GPU精粹3 GPU编程

    2018-08-07 10:56:42
    GPU精粹3 经典的GPU编程教材 对并行计算相关问题介绍非常透彻
  • CUDA GPU 编程

    2018-06-17 18:17:51
    Nvidia CUDA GPU 编程, pdf, epub mobi 三种格式都有了
  • GPU编程资料

    2018-03-27 17:08:24
    GPU编程资料。。。。。。。。。。。。。。。。。。。。。。
  • cuda-Python GPU编程我目前正在使用python开发一个项目,我想利用GPU进行一些计算。乍一看,似乎有许多可用的工具。 乍一看,我觉得我错过了一些东西。Copperhead看起来很棒,但尚未发布。 看来,我只限于编写低级...

    cuda-Python GPU编程

    我目前正在使用python开发一个项目,我想利用GPU进行一些计算。

    乍一看,似乎有许多可用的工具。 乍一看,我觉得我错过了一些东西。

    Copperhead看起来很棒,但尚未发布。 看来,我只限于编写低级CUDA或openCL内核。 没有推力,没有cudpp。 如果id想要进行某种排序,我必须自己完成。

    在我看来,这似乎不太正确。 我确实想念什么吗? 还是这种GPU脚本还不完全符合宣传要求?

    编辑:GPULIB似乎可能是我需要的。 文档是基本的,并且仅以顺便提及了python绑定,但是我现在正在申请下载链接。 是否有人对此有经验,或是否有类似的供学术免费使用的GPU库的链接? 重新编辑:好的,python绑定实际上不存在。

    Edit2:所以我猜我最好的选择是用C / CUDA编写一些东西,然后从python调用它?

    7个解决方案

    28 votes

    PyCUDA提供了与CUDA的很好的集成,并且具有多个帮助程序接口,与直接编写C api相比,使编写CUDA代码更加容易。 这是来自Wiki的示例,该示例无需任何C代码即可进行2D FFT。

    Joseph Lisee answered 2020-01-13T17:19:08Z

    10 votes

    我将在这里发布一些我在reddit上阅读的信息。 对于不了解不同程序包功能以及如何将cuda与Python连接的人来说将很有用:

    从:Reddit

    在这个线程中,关于各种项目打算做什么以及它们准备得如何有很多困惑。 没有“用于NumPy的GPU后端”(对于SciPy的任何功能都少得多)。 有几种方法可以在Python和一些类似GPU数组的对象中编写CUDA代码,这些对象支持NumPy的ndarray方法的子集(但不支持其余的NumPy,例如linalg,fft等)。

    PyCUDA和PyOpenCL最接近。 它们消除了启动GPU内核周围的许多麻烦问题(简化了阵列创建和内存传输,无需手动释放等等)。 但是,在大多数情况下,您仍然无法手动编写CUDA内核,它们恰好以三引号字符串的形式出现在Python文件中。 PyCUDA的GPUarray确实包含一些类似于NumPy的功能,因此,如果您做的非常简单,则可能无需自己编写任何内核就可以逃脱。

    NumbaPro包含一个“ cuda.jit”装饰器,使您可以使用Python语法编写CUDA内核。 实际上,与PyCUDA所做的事情(引用的内核源代码)相比,并没有太大的进步,只是您的代码现在看起来更像Python。 但是,它绝对不会自动在GPU上运行现有的NumPy代码。

    Theano允许您构造符号表达树,然后编译它们以在GPU上运行。 它不是NumPy,仅具有一小部分NumPy功能的等效项。

    gnumpy是围绕CudaMat的薄薄包装纸。 唯一受支持的元素类型是float32,并且仅实现了NumPy的一小部分。

    Ramon Martinez answered 2020-01-13T17:19:57Z

    7 votes

    我知道这个线程很旧,但是我想我可以带一些相关信息来回答所问的问题。

    Continuum Analytics的软件包中包含可为您解析CUDA计算的库。 基本上,您需要用装饰器检测需要并行化(在函数内)的代码,并且需要导入库。 因此,您不需要任何有关CUDA指令的知识。

    信息可以在NVIDIA页面上找到

    [https://developer.nvidia.com/anaconda-accelerate]

    或者您可以直接转到Continuum Analytics'页面

    [https://store.continuum.io/cshop/anaconda/]

    试用期为30天,并为学者提供免费许可证。

    我广泛使用它,并将代码加速10到50次。

    Bogdan answered 2020-01-13T17:20:48Z

    5 votes

    Theano看起来可能就是您要找的东西。 据我了解,它非常有能力在GPU上进行一些繁重的数学运算,并且似乎可以得到积极维护。

    祝好运!

    katzenklavier answered 2020-01-13T17:21:13Z

    2 votes

    检查此页面以获取随Anaconda分发的开源库[https://www.anaconda.com/blog/developer-blog/open-sourcing-anaconda-accelerate/]

    “今天,我们发布了两个新的Numba子项目pyculib和pyculib_sorting,其中包含NVIDIA GPU库Python包装器和Accelerate的排序功能。这些包装器可与NumPy阵列和Numba GPU设备阵列配合使用,以从中访问加速功能 :cuBLAS:线性代数cuFFT:快速傅立叶变换cuSparse:稀疏矩阵运算cuRand:随机数生成(仅主机功能)排序:从CUB和ModernGPU移植的快速排序算法展望未来,Numba项目将负责pyculib和pyculib_sorting,并在新的Numba版本发布时根据需要发布更新。 这些项目都是BSD许可的,就像Numba一样,

    Cristiana S. Parada answered 2020-01-13T17:21:39Z

    1 votes

    您看过PyGPU吗?

    [http://fileadmin.cs.lth.se/cs/Personal/Calle_Lejdfors/pygpu/]

    onteria_ answered 2020-01-13T17:22:03Z

    0 votes

    我可以推荐scikits.cuda。 但为此,您需要下载CULA完整版(学生免费)。 另一个是CUV。如果您正在寻找更好的东西并且愿意为此付出代价,还可以看看array fire。

    Moj answered 2020-01-13T17:22:24Z

    展开全文
  • GPU编程模型

    2021-02-25 01:14:46
    当第三代GPU出现的时候,GPU开始用于图形编程,研究者们给GPU烧制程序,进行图像处理。GPU的并行流处理能力吸引了并行计算的研究者,研究者们借助图形编程的概念,把计算操作转化成图形纹理操作。这个时候GPU计算,...
  • 多核与GPU编程附录

    2017-05-09 15:51:59
    《多核与GPU编程》一书的附录
  • tensorflow 多GPU编程

    2020-06-28 11:19:26
    1、如何在tensorflow中实现多GPU编程,目前看到介绍最详细的是 tensorflow 多GPU编程 (膜拜大佬) 2、如何在keras中实现多GPU编程,详见官方文档Multi-GPU and distributed training 3、实验: 修改tensorflow官方...

    1、如何在tensorflow中实现多GPU编程,目前看到介绍最详细的是
    tensorflow 多GPU编程
    (膜拜大佬)
    2、如何在keras中实现多GPU编程,详见官方文档Multi-GPU and distributed training

    3、实验:
    修改tensorflow官方教程中的 基于注意力的神经机器翻译”
    在合适的地方添加x下列句子。

        strategy = tf.distribute.MirroredStrategy()
        with strategy.scope():
    

    strategy.scope范围内 新建模型和优化器
    改动前:

            encoder = Encoder(un_word_num, settings.embedding_dim, settings.units, settings.BATCH_SIZE)
            decoder = Decoder(un_word_num, settings.embedding_dim, settings.units, settings.BATCH_SIZE)
    
            optimizer = tf.train.AdamOptimizer()
    
    

    改动后:

        strategy = tf.distribute.MirroredStrategy()
        print('Number of devices: {}'.format(strategy.num_replicas_in_sync))
    
        with strategy.scope():
            encoder = Encoder(un_word_num, settings.embedding_dim, settings.units, settings.BATCH_SIZE)
            decoder = Decoder(un_word_num, settings.embedding_dim, settings.units, settings.BATCH_SIZE)
    
            optimizer = tf.train.AdamOptimizer()
    
    

    tensorflow版本:1.14

    问题:
    我用自己的一个文本数据测试的时候会出现,
    相同迭代次数,多GPU模型loss下降慢,但效果更好的现象。
    不确定是模型还是数据集的问题,推测是因为bach size变相增大了,模型下降时情况更复杂了。

    展开全文
  • GPU编程自学10 —— 流并行

    万次阅读 2017-08-23 14:54:41
    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。目录 《GPU编程自学1 —— 引言》 《GPU编程自学2 —— CUDA环境配置》 《GPU编程自学3 —— CUDA程序...

    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。

    目录

    十、 流并行

    我们前面学习的CUDA并行程序设计,基本上都是在一批数据上利用大量线程实现并行。 除此之外, NVIDIA系列GPU还支持另外一种类型的并行性 ——

    GPU中的流并行类似于CPU上的任务并行,即每个流都可以看作是一个独立的任务,每个流中的代码操作顺序执行。

    下面从流并行的基础到使用来说明。

    10.1 页锁定内存

    流并行的使用需要有硬件支持:即必须是支持设备重叠功能的GPU。

    通过下面的代码查询设备是否支持设备重叠功能

    cudaDeviceProp mprop;
    cudaGetDeviceProperties(&mprop,0);
    if (!mprop.deviceOverlap)
    {
        cout << "Device not support overlaps, so stream is invalid!" << endl;
    }

    只有支持设备重叠,GPU在执行一个核函数的同时,才可以同时在设备与主机之间执行复制操作。 当然,这种复制操作需要在一种特殊的内存上才可以进行 —— 页锁定内存

    • 页锁定内存: 需要由cudaHostAlloc()分配,又称为固定内存(Pinned Memory)或者不可分页内存。 操作系统将不会对这块内存分页并交换到磁盘上,从而确保了该内存始终驻留在物理内存中,因为这块内存将不会被破坏或者重新定位。 由于gpu知道内存的物理地址,因此可以通过“直接内存访问(Direct Memory Access,DMA)” 直接在gpu和主机之间复制数据。
    • 可分页内存: malloc()分配的内存是标准的、可分页的(Pagable)主机内存。 可分页内存面临着重定位的问题,因此使用可分页内存进行复制时,复制可能执行两次操作:从可分页内存复制到一块“临时”页锁定内存,然后从页锁定内存复制到GPU。

    虽然在页锁定内存上执行复制操作效率比较高,但消耗物理内存更多。因此,通常对cudaMemcpy()调用的源内存或者目标内存才使用,而且使用完毕立即释放。

    10.2 流并行机制

    流并行是指我们可以创建多个流来执行多个任务, 但每个流都是一个需要按照顺序执行的操作队列。 那么我们如何实现程序加速? 其核心就在于,在页锁定内存上的数据复制是独立于核函数执行的,即我们可以在执行核函数的同时进行数据复制。

    这里的复制需要使用cudaMemcpyAsync(),一个以异步执行的函数。调用cudaMemcpyAsync()时,只是放置一个请求,表示在流中执行一次内存复制操作。当函数返回时,我们无法确保复制操作已经结束。我们能够得到的保证是,复制操作肯定会当下一个被放入流中的操作之前执行。(相比之下,cudaMemcpy()是一个同步执行函数。当函数返回时,复制操作已完成。)

    以计算 a + b = c为例,假如我们创建了两个流,每个流都是按顺序执行:

    复制a(主机到GPU) -> 复制b(主机到GPU) -> 核函数计算 -> 复制c(GPU到主机)

    SouthEast

    如上图,复制操作和核函数执行是分开的,但由于每个流内部需要按顺序执行,因此复制c的操作需要等待核函数执行完毕。 于是,整个程序执行的时间线如下图:(箭头表示需要等待)

    SouthEast

    从上面的时间线我们可以启发式的思考下:如何调整每个流当中的操作顺序来获得最大的收益? 提高重叠率

    如下图所示,假如复制一份数据的时间和执行一次核函数的时间差不多,那么我们可以采用交叉执行的策略:

    SouthEast

    由于流0的a和b已经准备完成,因此当复制流1的b时,可以同步执行流0的核函数。 这样整个时间线,相较于之前的操作很明显少掉了两块操作。

    10.3 流并行示例

    与流相关的常用函数如下:

    // 创建与销毁
    cudaStream_t stream//定义流 
    cudaStreamCreate(cudaStream_t * s)//创建流 
    cudaStreamDestroy(cudaStream_t s)//销毁流 
    
    //同步 
    cudaStreamSynchronize()//同步单个流:等待该流上的命令都完成 
    cudaDeviceSynchronize()//同步所有流:等待整个设备上流都完成 
    cudaStreamWaitEvent()//等待某个事件结束后执行该流上的命令 
    cudaStreamQuery()//查询一个流任务是否完成 
    
    //回调 
    cudaStreamAddCallback()//在任何点插入回调函数 
    
    //优先级 
    cudaStreamCreateWithPriority() 
    cudaDeviceGetStreamPriorityRange()

    下面给出一个2个流执行a + b = c的示例, 我们假设数据量非常大,需要将数据拆分,每次计算一部分。

    #include <iostream>
    #include "cuda_runtime.h"
    
    
    using namespace std;
    
    #define N   (1024*256)  // 每次处理的数据量
    #define SIZE   (N*20)  //数据总量
    
    // 核函数,a + b = c
    __global__ void add(int* a, int* b, int* c)
    {
        int i = blockIdx.x * blockDim.x + threadIdx.x;
        if (i < N)
            c[i] = a[i] + b[i];
    }
    
    int main()
    {
        // 获取0号GPU的属性并判断是否支持设备重叠功能
        cudaDeviceProp mprop;
        cudaGetDeviceProperties(&mprop,0);
        if (!mprop.deviceOverlap)
        {
            cout << "Device not support overlaps, so stream is invalid!" << endl;
            return 0;
        }
    
        // 创建计时事件
        cudaEvent_t     start, stop;
        cudaEventCreate(&start); cudaEventCreate(&stop);
        float           elapsedTime;
    
        // 创建流
        cudaStream_t    stream0, stream1;
        cudaStreamCreate(&stream0);
        cudaStreamCreate(&stream1);
    
        // 开辟主机页锁定内存,并随机初始化数据
        int *host_a, *host_b, *host_c;
        cudaHostAlloc((void**)&host_a, SIZE*sizeof(int), cudaHostAllocDefault);
        cudaHostAlloc((void**)&host_b, SIZE*sizeof(int), cudaHostAllocDefault);
        cudaHostAlloc((void**)&host_c, SIZE*sizeof(int), cudaHostAllocDefault);
        for (size_t i = 0; i < SIZE; i++)
        {
            host_a[i] = rand();
            host_b[i] = rand();
        }
    
        // 声明并开辟相关变量内存
        int *dev_a0, *dev_b0, *dev_c0;   //用于流0的数据
        int *dev_a1, *dev_b1, *dev_c1;   //用于流1的数据
        cudaMalloc((void**)&dev_a0,N*sizeof(int));
        cudaMalloc((void**)&dev_b0, N*sizeof(int));
        cudaMalloc((void**)&dev_c0, N*sizeof(int));
        cudaMalloc((void**)&dev_a1, N*sizeof(int));
        cudaMalloc((void**)&dev_b1, N*sizeof(int));
        cudaMalloc((void**)&dev_c1, N*sizeof(int));
    
        /************************  核心计算部分    ***************************/
        cudaEventRecord(start, 0);
        for (size_t i = 0; i < SIZE; i += 2*N)
        {
    
            // 复制流0数据a
            cudaMemcpyAsync(dev_a0, host_a + i,   N*sizeof(int), cudaMemcpyHostToDevice, stream0);
            // 复制流1数据a
            cudaMemcpyAsync(dev_a1, host_a + i+N, N*sizeof(int), cudaMemcpyHostToDevice, stream1);
            // 复制流0数据b
            cudaMemcpyAsync(dev_b0, host_b + i,   N*sizeof(int), cudaMemcpyHostToDevice, stream0);
            // 复制流1数据b
            cudaMemcpyAsync(dev_b1, host_b + i+N, N*sizeof(int), cudaMemcpyHostToDevice, stream1);
            // 执行流0核函数
            add << <N / 256, 256, 0, stream0 >> >(dev_a0, dev_b0, dev_c0);
            // 执行流1核函数
            add << <N / 256, 256, 0, stream1 >> >(dev_a1, dev_b1, dev_c1);
            // 复制流0数据c
            cudaMemcpyAsync(host_c + i*N,   dev_c0, N*sizeof(int), cudaMemcpyDeviceToHost, stream0);
            // 复制流1数据c
            cudaMemcpyAsync(host_c + i*N+N, dev_c1, N*sizeof(int), cudaMemcpyDeviceToHost, stream1);
        }
    
        // 流同步
        cudaStreamSynchronize(stream0);
        cudaStreamSynchronize(stream1);
    
        // 处理计时
        cudaEventSynchronize(stop);
        cudaEventRecord(stop, 0);
        cudaEventElapsedTime(&elapsedTime, start, stop);
        cout << "GPU time: " << elapsedTime << "ms" << endl;
    
        // 销毁所有开辟的内存
        cudaFreeHost(host_a); cudaFreeHost(host_b); cudaFreeHost(host_c);
        cudaFree(dev_a0); cudaFree(dev_b0); cudaFree(dev_c0);
        cudaFree(dev_a1); cudaFree(dev_b1); cudaFree(dev_c1);
    
        // 销毁流以及计时事件
        cudaStreamDestroy(stream0); cudaStreamDestroy(stream1);
        cudaEventDestroy(start);    cudaEventDestroy(stop);
    
        return 0;
    }

    参考资料

    • 《CUDA by Example: An Introduction to General-Purpose GPU Programming》 中文名《GPU高性能编程CUDA实战》
    展开全文
  • 深入优化GPU编程概述

    千次阅读 2018-05-09 15:11:36
    网上关于GPU编程优化的文章很多,本篇博客带领读者更深入的理解GPU编程以及各个函数的运行时间,为开发者优化Shader编程提供一些指导。
  • 根据《GPU编程与优化》的学习有: 1.获取配置GPU设备 cudaSetDevice(0); //获取GPU设备,如果只有一个默认为0,这个时候可以缺省,其他情况这不行。 2.分配GPU显存大小 cudaMalloc((void**) &d_a, sizeof...
  • GPU编程自学9 —— 原子操作

    千次阅读 2017-08-18 22:33:15
    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。目录 《GPU编程自学1 —— 引言》 《GPU编程自学2 —— CUDA环境配置》 《GPU编程自学3 —— CUDA程序...
  • GPU编程自学8 —— 纹理内存

    千次阅读 2017-08-11 12:01:27
    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。目录 《GPU编程自学1 —— 引言》 《GPU编程自学2 —— CUDA环境配置》 《GPU编程自学3 —— CUDA程序...
  • GPU编程自学5 —— 线程协作

    千次阅读 2017-08-05 17:12:50
    深度学习的兴起,使得多线程以及GPU编程逐渐成为算法工程师无法规避的问题。这里主要记录自己的GPU自学历程。目录 《GPU编程自学1 —— 引言》 《GPU编程自学2 —— CUDA环境配置》 《GPU编程自学3 —— CUDA程序...
  • GPU编程实例

    千次阅读 2015-05-19 15:03:51
    GPU编程示例:向量加法和矩阵乘法
  • GPU编程自学1 —— 引言》《GPU编程自学2 —— CUDA环境配置》《GPU编程自学3 —— CUDA程序初探》《GPU编程自学4 —— CUDA核函数运行参数》《GPU编程自学5 —— 线程协作》《GPU编程自学6 —— 函数与变量类型...
  • 基于GPU编程的地形纹理快速渲染方法研究
  • CUDA并行程序设计:GPU编程指南共分为12章。 第1章 超级计算简史 第2章 使用GPU理解并行计算 第3章 CUDA硬件概述 第4章 CUDA环境搭建 第5章 线程网格、线程块以及线程 第6章 CUDA内存处理 第7章 CUDA实践之道 ...
  • Lift 编程语言:高性能、可移植的函数式 GPU 编程语言。部分由Google赞助支持
  • MATLAB GPU编程基础

    千次阅读 2015-10-29 15:56:50
    matlab GPU编程基础

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,651
精华内容 1,860
关键字:

gpu编程