精华内容
下载资源
问答
  • GPGPU

    千次阅读 2011-03-17 17:10:00
    GPGPU可以被称为通用图形处理器。其中第一个“GP”通用目的(GeneralPurpose)而第二个“GP”则表示图形处理(GraphicProcess),这两个“GP”搭配起来就是“通用图形处理”。而再加上“U”(Unit)就成为了完整的通用...

      GPGPU可以被称为通用图形处理器。其中第一个“GP”通用目的(GeneralPurpose)而第二个“GP”则表示图形处理(GraphicProcess),这两个“GP”搭配起来就是“通用图形处理”。而再加上“U”(Unit)就成为了完整的通用处理器。

      目前拥有双向发展的AMD更需要让GPU有个完美的发展前景,在GPU中基于了一套完整的DiretX、OpenGL开放标准,并且在发布了开源工具、Linux开源驱动之后又继续向外界公开GPU的微代码。AMD认为只有开放的标准才能让自己走的更远。而且AMD也希望与其他厂商共同前进集思广益,共同打造出一个完美开放式的通用计算标准,虽然NVIDIA也加入了开源的行列,但AMD认为CUDA方式并不符合自己的开放方向而放弃采用。

      在通用计算和图形处理领域里可以说是三国鼎立。Intel堪称通用计算的龙头,但是只有CPU而没有真正独立的GPU,虽然在各种宣传中一再强调CPU的重要性,但从其收购Havok来看,Intel自然也想在图形处理领域里分一杯羹。而图形领域里的龙头NVIDIA则与Intel相反,其只拥有GPU而没有完整独立的CPU。但最近两年的发展趋势不难看出NVIDIA正在努力的向通用计算领域里挺进。而AMD在成功收购ATI之后,则是同时即拥有完整独立的GPU和CPU,而GPGPU的概念也再一次成为关注焦点。

     

    近年来,GPU (Graphic Processing Unit ) 得到了高速的发展,GPU非常适合于高效率低成本的高性能并行数值计算。而GPGPU (General-purpose computing on graphics processing units) 是一种使用处理图形任务的专业图形处理器来从事原本由中央处理器处理的通用计算任务,这些通用计算常常与图形处理没有任何关系。现代图形处理器强大的并行处理能力和可编程流水线,使得用流处理器处理非图形数据成为可能。特别是在面对单指令流多数据流(SIMD)且数据处理的运算量远大于数据调度和传输的需要时,通用图形处理器在性能上大大超越了传统的中央处理器应用程序。另一方面,CPU 由于受摩尔定律的限制,采用提高CPU制程和主频的办法遇到了工艺上的壁垒,暂时无法突;而从1993年开始,GPU的性能以每年2.8倍的速度增长,如下图所示。

     

    CPUGPU都是具有运算能力的芯片,CPU更像“通才”——指令运算(执行)为重+ 数值运算,GPU则更像“专才”——并行数值计算为核心。CPUGPU平等运算已经有五年时间,对大量运算平行处理,CPU面临越来越大的困难。更形象地说, CPUGPU运算好比送比萨,CPU一次一次地送,一次送一个,像卡车原理,再大但总有最后一个,到时候就凉了。唯一解决的方法是让卡车的容量再大,速度再快。但总会有一个极限,当遭遇瓶颈时,就会发热,耗油。GPU正好相反,它就像几百个小车,每个都很小,很简单,体积耗电小,做复杂的事很有限,但在1秒或者几秒内能够很好地处理信息。目前GPU数值计算的优势主要是浮点运算,它执行浮点运算快是靠大量并行,GPGPU具有比CPU高一个数量级的浮点性能,但是这种数值运算的并行性在面对程序的逻辑执行时毫无用处。总的来说,CPU擅长的:操作系统,系统软件,应用程序,通用计算,系统控制等等;游戏中人工智能,物理模拟等等;3D建模-光线追踪渲染;虚拟化技术——抽象硬件,同时运行多个操作系统或者一个操作系统的多个副本等等。GPU擅长的:图形类矩阵运算,非图形类并行数值计算,高端3D游戏。在一台均衡计算的计算机系统中,CPUGPU还是各司其职,除了图形运算,GPU将来可能主要集中在高效率低成本的高性能并行数值计算,帮助CPU分担这种类型的计算,提高系统这方面的性能。

        GPU的并行运算性能是极为强悍的,而传统的图形API又单单的只提供了图形操作的功能,没有提供类似于CPU那样通用计算的接口,CUDA的出现将改变这一状况。CUDA的本质是,NVIDIA为自家的GPU编写了一套编译器NVCC极其相关的库文件。CUDA主要在驱动程序方面和函数库方面进行了扩充。在CUDA库中提供了标准的FFTBLAS库,一个为NVDIA GPU设计的C编译器。CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。开发人员现在可以使用应用最广泛的高级编程语言C语言来为CUDA™架构编写程序。因此可以在支持CUDA™的处理器上以超高性能运行。将来还会支持其它语言,包括FORTRAN以及C++。目前,支持CUDAGPU销量已逾1亿,数以千计的软件开发人员正在使用免费的CUDA软件开发工具来解决各种专业以及家用应用程序中的问题,为各种应用程序加速。这些应用程序从视频与音频处理和物理效果模拟到石油天然气勘探、产品设计、医学成像以及科学研究,涵盖了各个领域。技术特点主要有:(1)用于GPU并行应用开发的标准C语言;(2)快速傅里叶转换(FFT)以及基本线性代数子程序(BLAS)的标准数字库;(3)专用CUDA驱动器,用于GPUCPU之间快速数据传输计算;(3CUDA驱动程序与OpenGLDirectX图形驱动程序可以实现互操作;(3)支持Linux 32/64位,Windows XP 32/64位以及Mac 操作系统。详细内容见其官方网页:http://www.nvidia.cn/object/cuda_what_is_cn.html 。除了NVIDIA,,还有INTELAMD(ATI)等主要GPU

     

    GPGPU:从图形处理到通用计算

    GPU用于通用计算(General Purpose GPU,也就是GPGPU)成为最近几年来业内备受关注的一个话题。在很长一段时间,GPU都是图形处理的专有载体,很少有人想过使用GPU来处理绘图之外的一般计算。然而,近几年来,GPU性能的迅速提升以及相关技术的发展让人们对于GPU的这一应用给予了空前的期望和热情。

    在性能提升的速度上,GPU已经远远超出CPU。很长一段时间以来,CPU一直按照摩尔定律阐释的速度向前发展,每隔18个月单位面积IC上所容纳的晶体管数目便增加一倍,性能也提升一倍。然而,自1993年开始,GPU的性能便以每年2.8倍的速度高速增长。

    而在浮点运算能力和带宽等关键指标上,GPU也远远超出了同期的CPU。拿一块工作频率为3.0GHz的P4处理器来说,其晶体管数目为1.25亿个,即使算上SSE指令集的SIMD,也只有6GFlops的峰值浮点处理能力,而同期的一块NV 40 GPU就有2.22亿个晶体管,峰值浮点运算能力很轻易就超过40GFlops。拿带宽来说,英特尔曾为其P4 XE系列处理器(1066MHz前端总线)所能提供的8.6G带宽而倍感自豪,而同期一块普通的GeForce 6800就拥有20GB/s以上的显存带宽。

    基于强大的并行处理能力和极高的存储器带宽,我们完全可以将GPU抽象成一个流处理器(Steam Processor),来用于诸如科学计算、数据分析、线性代数、流体模拟等需要大量重复的数据运算和密集的内存存取的应用程序,那么我们就能获得比CPU强悍的多的计算能力。

    随着GPU可编程性技术的出现,GPGPU也由构想逐渐进入可以实用的崭新阶段。

    S3 FotoPro™:开GPGPU应用之先河

    但是从实用到应用,还有一个重要的坎要跨,那就是必须有相应的计算工具与之相配合。S3 FotoPro™正是这样一款计算工具,目前其主要的应用是借助S3 GPU的流处理器架构从事复杂图形计算进而改善图像质量。

    FotoPro可以对图像进行评估,然后使用可定制算法对图片进行适当调整,以增强色彩清晰度、减少雾化、优化饱和度和音色平衡性、提高人物皮肤平滑度等,还能同时对多个图像进行自动增强处理。此外,在进行图像质量增强的时候,并不破坏原始文件,而是在文件名之后加入“_r”后缀另存为新图像。

     

     

     

    原始图片 经过Fotopro增强后的图形效果

    如下图所示,在使用S3 FotoPro™进行图像质量改善的时候,并不是GPU承担所有的计算任务,而是GPU和CPU来协同完成。如下图所示,其基本的程序如下,当图形计算的任务下达后,首先由CPU完成解码工作,然后将需要进展的后续工作根据不同的处理单元特性进行匹配性分配。需要进行大量并行计算的任务便由GPU承担,而剩下的协调计算任务则由CPU自己来完成。在这个过程中,基本的计算资料置于CPU的寄存器中,GPU和CPU根据各自计算的需要从中调用基础数据。当这一阶段的计算过程完成,CPU便将双方计算获得的数据进行整合,重新编码,进而获得质量改善后的图片。

     

     

     

     

    由于在使用过程中,GPU的并行计算能力得到了充分的应用,直接反应在结果上,便是处理任务的时间大幅缩短。如下图所示,在将GPU纳入之后,处理同一任务的时间缩短近60%,但是图像处理的品质却毫不逊色。

     

     

     

     

     

    注:在本次测试中,CPU采用的是Intel E8200 (2.66G dual-core)

    如今,S3 FotoPro还在持续改进中。据S3工程师介绍,在未来推出的版本中,将会让GPU承担更多的计算任务,如解码/编码、更多的分析工作等,以充分发挥其强大的并行计算能力。

    尽管目前的应用还没有脱离图形处理的范畴,但是S3 FotoPro的推出还是让人们看到了希望:GPGPU并不是仅仅停留在概念或者实验室层面,而是已经可以应用并解决现实问题。相信,不久之外,在HPC、高清视频编解码、科学计算、工程计算、医学、图像处理、物理计算等众多领域,我们都可以看到GPGPU技术应用的身影。 (本文来源:网易数码 ) 周京生

    展开全文
  • gpgpu-源码

    2021-03-10 07:19:11
    gpgpu
  • GPGPU-MiniBench:加速GPGPU微体系结构仿真
  • gpgpu_GPGPU Java编程

    2020-05-09 17:35:52
    gpgpu 在我们以前的一篇文章中,我们讨论了图形处理单元(GPGPU)的通用处理概念和体系结构。 对于C / C ++程序员来说,这一切都很棒,但是对于Java程序员而言,写C / C ++而不是Java至少可以带来不便。 那么为Java...

    gpgpu

    在我们以前的一篇文章中,我们讨论了图形处理单元(GPGPU)的通用处理概念和体系结构。 对于C / C ++程序员来说,这一切都很棒,但是对于Java程序员而言,写C / C ++而不是Java至少可以带来不便。 那么为Java程序员提供哪些工具呢?

    在我们开始编写一些背景知识之前。 有两个竞争的GPGPU SDK: OpenCLCUDA OpenCL是所有GPU供应商(即AMD,NVIDIA和Intel)支持的开放标准,而CUDA是NVIDIA特定的,并且仅在NVIDIA卡上工作。 这两个SDK都支持C / C ++代码,这无疑使我们的Java开发人员感到冷漠。 到目前为止,还没有纯Java OpenCL或CUDA支持。 对于需要利用GPU大量并行潜力的Java程序员来说,这并没有太大帮助,除非她摆弄Java Native接口。 当然,有一些Java工具可以减轻GPGPU Java编程的麻烦。

    最受欢迎的两个(IMHO)是jocljcuda 使用这些工具,您仍然必须编写C / C ++代码,但这至少仅适用于将在GPU中执行的代码,从而极大地减少了工作量。

    这次,我将看一看jcuda,看看如何编写一个简单的GPGPU程序。

    让我们从设置CUDA GPGPU linux开发环境开始(尽管Windows和Mac环境也不难设置):

    步骤1 :在计算机中安装启用了NVIDIA CUDA的GPU。 NVIDIA开发人员网站上有支持CUDA的GPU列表。 新的NVIDIA GPU几乎可以肯定已启用CUDA,但以防万一,请检查卡的规格以确保…

    步骤2 :安装NVIDIA驱动程序和CUDA SDK。 下载它们并从此处找到安装说明。

    步骤3 :转到目录〜/ NVIDIA_GPU_Computing_SDK / C / src / deviceQuery并运行make

    步骤4 :如果编译成功,请转到目录〜/ NVIDIA_GPU_Computing_SDK / C / bin / linux / release并运行文件deviceQuery 您将获得有关卡的许多技术信息。

    这是我的GeForce GT 430卡所获得的:

    注意2个具有48个CUDA核心的多处理器,每个核心共有96个核心,对于价值约40欧元的低端视频卡来说还不错!!!

    步骤5 :现在您已经有了CUDA环境,让我们用C语言编写和编译CUDA程序。编写以下代码并将其保存为multiple.cu。

    #include <iostream>
    
    __global__ void multiply(float a, float b, float* c)
    {
      *c=a*b;
    }
    
    int main()
    {
      float a, b, c;
      float *c_pointer;
      a=1.35;
      b=2.5;
    
      cudaMalloc((void**)&c_pointer, sizeof(float));
      multiply<<<1,1>>>(a, b, c_pointer);
      cudaMemcpy(&c, c_pointer, sizeof(float),cudaMemcpyDeviceToHost);
    /*** This is C!!! You manage your garbage on your own!  ***/    
      cudaFree(c_pointer);
      printf("Result = %f\n",c);
    }

    使用cuda编译器对其进行编译并运行:

    $ nvcc multiply.cu -o multiply
    $ ./multiply
    Result = 3.375000
    $

    那么上面的代码做什么? 带有__global__限定符的乘法函数称为内核 ,是将在GPU中执行的实际代码。 尽管存在一些语义差异,但main函数中的代码在CPU中作为普通C代码执行:

    1. 用<<< 1,1 >>>括号调用乘法函数。 方括号内的两个数字告诉CUDA代码应执行多少次。 CUDA使我们能够创建所谓的一维,二维或什至三维线程块。 此示例中的数字表示一个维度上运行的单个线程块,因此我们的代码将执行1×1 = 1次。
    2. cudaMalloc,cudaMemcpy和cudaFree函数用于处理GPU内存的方式与处理C语言中计算机的普通内存类似。cudaMemcpy函数非常重要,因为GPU具有自己的RAM,并且在处理内核中的任何数据之前我们需要将它们加载到GPU内存中。 当然,完成后,我们还需要将结果复制回普通内存。

    现在我们掌握了如何在GPU中执行代码的基础知识,让我们看看如何从Java运行GPGPU代码。 请记住,内核代码仍将用C编写,但是至少现在主要功能是在jcuda的帮助下的Java代码。

    下载jcuda二进制文件,解压缩它们,并确保包含.so文件的目录(或Windows的.dll)在JVM的java.library.path参数中给出,或将其附加到LD_LIBRARY_PATH环境变量中(或Windows中的PATH变量)。 同样,在编译和执行Java程序期间,jcuda-xxxxxxx.jar文件必须位于类路径中。

    现在,我们有了jcuda设置,让我们看一下与jcuda兼容的内核:

    extern "C"
    __global__ void multiply(float *a, float *b, float *c)
            /*************** Kernel Code **************/
    {
            c[0]= a[0] * b[0];
    }

    您会注意到与以前的内核方法有以下区别:

    1. 我们使用extern“ C”限定符来告诉编译器不要混用乘法方法名称,因此可以使用其原始名称进行调用。
    2. 对于a,b和c,我们使用数组而不是基元。 jcuda要求这样做,因为jcuda不支持Java原语。 在jcuda中,数据作为诸如浮点数,整数等之类的事物数组来回传递给GPU。

    将此文件另存为multiple2.cu 这次我们不想将文件编译为可执行文件,而是编译为将在我们的Java程序中调用的CUDA库。 我们可以将内核编译为PTX文件或CUBIN文件。 PTX是人类可读的文件,其中包含将即时编译的程序集(如代码)。 CUBIN文件是已编译的CUda BINaries,无需进行即时编译即可直接调用。 除非您需要最佳的启动性能,否则PTX文件是可取的,因为它们不会与编译时使用的GPU的特定计算能力挂钩,而CUBIN文件将无法在计算能力较低的GPU上运行。

    为了编译我们的内核,输入以下内容:

    $ nvcc -ptx multiply2.cu -o multiply2.ptx

    成功创建我们的PTX文件后,让我们看一下与我们的C示例中使用的main方法等效的java:

    import static jcuda.driver.JCudaDriver.*;
    import jcuda.*;
    import jcuda.driver.*;
    import jcuda.runtime.JCuda;
    
    public class MultiplyJ {
      public static void main(String[] args) {
    
         float[] a = new float[] {(float)1.35};
         float[] b = new float[] {(float)2.5};
         float[] c = new float[1];
     
         cuInit(0);
         CUcontext pctx = new CUcontext();
         CUdevice dev = new CUdevice();
         cuDeviceGet(dev, 0);
         cuCtxCreate(pctx, 0, dev);
         
         CUmodule module = new CUmodule();
         cuModuleLoad(module, "multiply2.ptx");
         CUfunction function = new CUfunction();
         cuModuleGetFunction(function, module, "multiply");
    
         CUdeviceptr a_dev = new CUdeviceptr();
         cuMemAlloc(a_dev, Sizeof.FLOAT);
         cuMemcpyHtoD(a_dev, Pointer.to(a), Sizeof.FLOAT);
    
         CUdeviceptr b_dev = new CUdeviceptr();
         cuMemAlloc(b_dev, Sizeof.FLOAT);
         cuMemcpyHtoD(b_dev, Pointer.to(b), Sizeof.FLOAT);
    
         CUdeviceptr c_dev = new CUdeviceptr();
         cuMemAlloc(c_dev, Sizeof.FLOAT);
    
         Pointer kernelParameters = Pointer.to(
                                    Pointer.to(a_dev),
                                    Pointer.to(b_dev),
                                    Pointer.to(c_dev)
                                    );
    
         cuLaunchKernel(function, 1, 1, 1, 1, 1, 1, 0, null, kernelParameters, null);
         cuMemcpyDtoH(Pointer.to(c), c_dev, Sizeof.FLOAT);
         JCuda.cudaFree(a_dev);
         JCuda.cudaFree(b_dev);
         JCuda.cudaFree(c_dev);
    
         System.out.println("Result = "+c[0]);
      }
    }

    好的,看起来很多代码只是将两个数字相乘,但是请记住,有关Java和C指针的限制。 因此,从第9至11行开始,我们将a,b和c参数转换为名为a,b和c的数组,每个数组仅包含一个浮点数。

    在第13至17行中,我们告诉jcuda我们将在系统中使用第一个GPU(高端系统中可能有多个GPU。)

    在第19至22行中,我们告诉jcuda我们的PTX文件是,以及我们要使用的内核方法的名称(在我们的例子中是乘法)

    在第24行,事情变得有趣起来,在第24行,我们使用了一个特殊的jcuda类CUdeviceptr,它充当指针占位符。 在第25行中,我们使用刚创建的CUdeviceptr指针分配GPU内存。 请注意,如果我们的数组有多个项目,则需要将Sizeof.FLOAT常数乘以数组中元素的数量。 最后,在第26行中,我们将第一个数组的内容复制到GPU。 同样,我们创建指针并将内容复制到第二个数组(b)的GPU RAM中。 对于我们的输出数组(c),我们现在仅需要分配GPU内存。

    在第35行中,我们创建一个Pointer对象,该对象将保存我们要传递给乘法方法的所有参数。

    我们在第41行执行内核代码,在此执行实用程序方法cuKernelLaunch,将函数和指针类作为参数传递。 函数参数之后的前六个参数定义了网格的数量(一个网格是一组块),并且在我们的示例中,这些块全为1,因为我们只执行一次内核。 接下来的两个参数为0和null ,用于标识我们可能定义的任何共享内存(可以在线程之间共享的内存),在本例中为无。 下一个参数包含创建的指针对象,该对象包含a,b,c设备指针,最后一个参数用于其他选项。

    内核返回后,我们只需将dev_c的内容复制到我们的c数组,释放我们在GPU中分配的所有内存,并打印存储在c [0]中的结果,这当然与我们的C示例相同。

    这是我们编译和执行MultiplyJ.java程序的方式(假设multiple2.ptx在同一目录中):

    $ javac -cp ~/GPGPU/jcuda/JCuda-All-0.4.0-beta1-bin-linux-x86_64/jcuda-0.4.0-beta1.jar MultiplyJ.java
    
    $ java -cp ~/GPGPU/jcuda/JCuda-All-0.4.0-beta1-bin-linux-x86_64/jcuda-0.4.0-beta1.jar:. MultiplyJ
    Result = 3.375
    $

    请注意,在此示例中,目录〜/ GPGPU / jcuda / JCuda-All-0.4.0-beta1-bin-linux-x86_64已经在我的LD_LIBRARY_PATH中,因此不需要在java.library.path中设置参数。 JVM。

    希望到目前为止,jcuda的机制已经很清楚了,尽管我们并未真正涉及到GPU真正的强大功能,即大规模并行性。 在以后的文章中,我将提供一个示例,说明如何使用java在CUDA中运行并行线程,并附带一个示例,说明哪些内容不能在GPU中运行。 GPU处理对于非常专业的任务很有意义,大多数任务最好由我们受信任的旧CPU处理。

    参考: W4G合作伙伴 Spyros Sakellariou的 GPGPU Java编程

    相关文章 :


    翻译自: https://www.javacodegeeks.com/2011/09/gpgpu-java-programming.html

    gpgpu

    展开全文
  • gpgpu_CPU与GPGPU

    2020-05-08 22:45:52
    gpgpu GPGPU是一种新趋势,它在年轻的计算机科学家的脑海中引发了许多新问题。 在本文中,我将介绍有关此主题的一些常见问题解答。 哪些类型的问题更适合常规多核,哪些类型的问题更适合GPGPU? GPU包含一些固定...

    gpgpu

    GPGPU是一种新趋势,它在年轻的计算机科学家的脑海中引发了许多新问题。 在本文中,我将介绍有关此主题的一些常见问题解答。

    哪些类型的问题更适合常规多核,哪些类型的问题更适合GPGPU?

    GPU包含一些固定功能和可编程硬件。 当GPU趋向于越来越多的可编程单元时,当今的GPU执行一些常见的图形任务,例如纹理采样和使用专用硬件进行渲染。 相反,像素阴影是使用可编程SIMD内核完成的。 GPGPU工作负载主要在SIMD着色器内核上运行。

    GPU是为非常规则的吞吐量工作负载而构建的,例如图形,密集矩阵矩阵乘法,简单的photoshop过滤器等。它们固有的设计可承受纹理采样的延迟(1000多次循环操作),因此擅长承受长时间延迟。 。 GPU内核具有许多线程:当一个线程触发长时间等待操作(例如,内存访问)时,该线程将进入睡眠状态(其他线程继续工作),直到长时间等待操作完成为止。 这使GPU可以使执行单元的工作量比传统内核多得多。

    GPU之所以难以处理分支,是因为GPU喜欢将“线程”(如果不是nVidia,则为SIMD通道)批处理为翘曲并将它们一起发送到管道中,以节省指令获取/解码能力。 如果线程遇到分支,则它们可能会发散,例如8线程扭曲中的2个线程可以选择分支,而其他6个线程则不可以。 现在,经纱被分为大小为2和6的两个经纱。这些新形成的经纱将运行效率低下。 2线程扭曲将以25%的效率运行,而6线程扭曲将以75%的效率运行。 您可以想象,如果GPU继续遇到嵌套分支,其效率将变得非常低。 因此,GPU并不擅长处理分支,因此带有分支的代码不应在GPU上运行。

    GPU在协作线程方面也很不利,因为在GPU上没有很好地支持同步(但nVidia已在其中)。

    因此,GPU的最差代码是并行性较低的代码或分支或同步性很多的代码,例如数据库,操作系统,图形算法等。

    编程模型的主要区别是什么?

    GPU不支持中断和异常。 对我来说,那是最大的不同。 除此之外, CUDA与C差别不大。您可以编写CUDA程序,然后将代码运送到GPU并在其中运行。 您在CUDA中访问内存的方式有所不同,但这又不是我们讨论的基础。

    导致编程模型上有差异的主要底层硬件差异是什么?

    我已经提到他们了。 最大的是GPU的SIMD性质,它要求以非常规则的方式编写代码,而没有分支和线程间通信。 这就是例如CUDA限制代码中嵌套分支数量的原因的一部分。

    哪一个通常更容易使用,多少钱?

    取决于您要编码的内容以及目标是什么。

    易于矢量化的代码: CPU易于编码,但性能较低。 GPU稍难编码,但可以带来很大的收益。 对于其他所有处理器,CPU都更容易使用,并且通常也具有更好的性能。

    从长远来看,为GPU实现高级并行性库(例如Microsoft的任务并行库或D的std.parallelism)是否可行?

    根据定义,任务并行性需要线程通信,并且还具有分支。 任务的思想是不同的线程执行不同的操作。 GPU专为许多功能相同的线程而设计。 我不会为GPU建立任务并行性库。

    如果GPU计算如此高效,为什么设计的CPU不更像GPU?

    世界上许多问题都是分支性的和不规则的。 数以千计的例子。 图表搜索算法,操作系统,Web浏览器等。补充一下,甚至图形也像每一代一样变得越来越分支和通用,因此GPU也将越来越像CPU。 我并不是说它们将变得像CPU,但它们将变得更具可编程性。 正确的模型位于低功耗CPU和非常专业的GPU之间。

    参考: Future Chips博客上我们JCG合作伙伴 Aater Suleman的CPU vs. GPGPU

    相关文章 :


    翻译自: https://www.javacodegeeks.com/2011/09/cpu-vs-gpgpu.html

    gpgpu

    展开全文
  • gpgpu-sim-docker:用于gpgpu-sim模拟环境的Dockerfile
  • ogles_gpgpu, 面向移动设备和使用 OpenGL 2.0的嵌入式系统的GPGPU ogles_gpgpu-- 使用 OpenGL 2.0的移动设备和嵌入式系统的GPGPU特性快速和可移植的C 代码快速纹理访问的平台优化在 iOS: 核心视频纹理缓存 API在...
  • GPGPU代表GPU上的通用计算。 该项目维护着各种库,实用程序类和编程示例,旨在帮助开发使用GPU进行通用计算的应用程序。
  • <div><p>I was trying to run the gpgpu-sim_simulation. <p>When I was trying to run the benmark ibackprop, the following error pops: <pre><code> terminate called after throwing an instance of 'std::...
  • Better GPGPU integration

    2020-11-26 07:51:25
    m trying to figure out how dask can efficiently implement a hybrid GPGPU algorithm. Apologies if this is going to be a long post - as I think it's best if I share my analysis of the problem before...
  • GPGPU中NoC的自适应VC分区
  • Need examples for GPGPU

    2021-01-10 05:22:26
    <div><p>Right now, there are not many examples that shows how regl can be used for GPGPU. But since regl greatly simplifies the usage of fbos, easy GPGPU is a great selling point of the framework, so ...
  • 首款国产7纳米GPGPU芯片在上海问世

    千次阅读 多人点赞 2021-04-02 16:54:44
    “做GPGPU就像下围棋,求乎上而得中,必须有这样的志向,从源头就向正确的方向砥砺前行。”上海天数智芯半导体公司(下称“天数智芯”)董事长蔡全根在谈及国产第一款GPGPU产品的研发心得时说。 3月31日,我国首款...

    本文转载自腾讯网

    “做GPGPU就像下围棋,求乎上而得中,必须有这样的志向,从源头就向正确的方向砥砺前行。”上海天数智芯半导体公司(下称“天数智芯”)董事长蔡全根在谈及国产第一款GPGPU产品的研发心得时说。

    3月31日,我国首款全自研高性能云端7纳米芯片天数智芯BI(Big Island)及产品卡在上海问世,这是一款基于通用GPU架构的GPGPU云端高端训练芯片,单芯每秒可进行147万亿次FP16计算(147TFLOPS@FP16)。7纳米芯片天数智芯BI问世前,高端GPGPU领域一直被英伟达和AMD等国际巨头垄断。测试数据显示,BI芯片以同类产品1/2的芯片面积、更低的功耗,提供主流厂商产品近2倍的性能。

    GPGPU即通用图形处理器(General-purpose computing on graphics processing units),是一种利用处理图形任务的图形处理器(GPU)来计算原本由中央处理器(CPU)处理的通用计算任务。GPGPU目前广泛应用于高性能计算、行业AI应用、互联网及云数据中心等,主要应用场景有人工智能模型训练与推理及高性能计算。

    在应用方面,天数智芯联合创始人、首席科学家及高级副总裁郑金山介绍称,目前,BI产品实测数据基本符合设计规划,BI芯片及产品卡均以实体形式发布,即将进入批量生产和商用交付,BI芯片及产品卡量产后能够为AI训练和推理、认知型AI、高性能数据分析、基因组研究、金融预测分析等各种高负载工作提供理想的算力支持,服务于教育、互联网、金融、自动驾驶、医疗、安防等各相关行业,赋能AI智能社会。

    可查资料显示,目前某头部供应商的一块高端GPGPU板卡,其售价接近一辆普通轿车的价格。据预测,到2025年中国GPGPU芯片板卡的市场规模将达到458亿元,2019年到2025年的年复合增长率超过30%。

    这款7纳米GPGPU芯片在数据存储和带宽限制等方面均有所突破。郑金山介绍称,这款BI芯片采用业界领先的7纳米制造工艺、2.5D CoWoS封装,容纳240亿晶体管,支持FP32、FP/BF16、INT32/16/8等多精度数据混合训练,集成32GB HBM2内存、存储带宽达1.2TB。

    中国工程院院士倪光南表示,这款国产首款7纳米GPGPU芯片在性能指标方面并不亚于国外顶级产品。“由于现在的国际形势,我们可能买不到国外的先进技术,卡脖子的地方要尽快弥补,要补齐。”倪光南表示。

    倪光南认为,这款GPGPU芯片拥有自己的技术体系和生态,应在此基础上逐步建立行业标准。“十八大以来,我国的信息产业实现了跨越式发展,目前在网信领域一些自主可控的核心技术已经向好用、易用的方向发展。但短板和痛点仍然存在,比如CPU、GPU这两种信息系统中最复杂的电路芯片,越来越成为整个产业链上必须突破的短板。”倪光南说。

    上海市经济和信息化委员会副主任张英表示,这款芯片的面世有望打破该项技术由国外公司长期垄断的局面。“算力是人工智能发展的三大基础要素之一,而芯片是AI算力的基础。目前,在以GPGPU为代表的通用AI芯片领域,中国与国外差距还是相当大的,这也是上海人工智能重点攻关的关键技术。”张英说。

    展开全文
  • FORM_GPGPU_DR20-源码

    2021-06-01 07:24:37
    FORM_GPGPU_DR20
  • GPGPU Java编程

    2020-04-14 22:58:05
    在我们之前的一篇文章中,我们讨论了图形处理单元(GPGPU)的通用处理概念和体系结构。 对于C / C ++程序员来说,这一切都很棒,但是对于Java程序员而言,写C / C ++而不是Java至少可以带来不便。 那么为Java程序员...
  • CPU与GPGPU

    2020-04-14 16:48:05
    GPGPU是一种新趋势,它在年轻的计算机科学家的脑海中引发了许多新问题。 在本文中,我将介绍有关此主题的一些常见问题解答。 哪些类型的问题更适合常规多核,哪些类型的更适合GPGPU? GPU包含一些固定功能和可编程...
  • webgl-gpgpu-demo-源码

    2021-05-11 14:39:27
    webgl-gpgpu-demo Web浏览器中的硬件加速的通用计算。 演示: :
  • 适用于GPGPU的低成本无冲突NoC
  • GPGPU-sim with cuDNN

    2020-12-26 21:41:10
    <div><p><strong>Environment Ubuntu 16.04.4 LTS gcc/g++ 5.4.0 20160609 Python 2.7 CUDA 8.0 cuDNN 7.1.4 gpgpu-sim_distribution dev branch ...gpgpu-sim/gpgpu-sim_distribution</p></div>
  • SIFT是目前应用最广泛的基于局部特征的图像特征提取算法之一,针对其运行速度制约其应用范围的问题,提出在图像处理器(GPGPU)上设计并实现将算法各核心模块映射到GPGPU的计算单元并针对GPUPU特性进行优化的SIFT...
  • gpgpu 在上一篇文章GPGPU for Java Programming中,我们展示了如何设置环境以从Java代码中执行CUDA。 但是,上一篇文章仅着重于环境的设置,而没有涉及并行性的话题。 在本文中,我们将看到如何利用GPU来做最擅长的...
  • 最近发现在sim的官网那个已经给出了安装好gpgpu-sim的虚拟机,也是大家的福音。请戳官网链接http://gpgpu-sim.org/,我的写一篇《GPGPU-Sim学习(二)(补充)gpgpu-sim官网所给虚拟机与自己所搭建虚拟机的使用感受》 ...
  • 通过数据感知提高GPGPU工作队列的效率
  • gpgpu-sim manual

    2020-04-08 15:53:39
    http://gpgpu-sim.org/manual/index.php/Main_Page Contents 1Introduction 1.1Contributors 1.1.1Contributing Authors to this Manual 1.1.2Contributors to GPGPU-Sim version 3.x 2Microar...
  • GPGPU的连接组件标记算法 这些是OpenCL,AVX2和Java实现的算法,将在下面的网页中进行说明。 [1]柴田直树,山本真矢:GPGPU辅助基准标记的亚像素跟踪方法,《信息处理学报》,2014年第22卷,第1期,第19-28页,2014...
  • GPGPU的异构低成本低延迟环形链网络
  • GPGPU Programming for Games and Science

空空如也

空空如也

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

gpgpu