精华内容
下载资源
问答
  • 关于FPGA的并行方式

    千次阅读 2019-09-26 18:42:15
    1. FPGA与GPU 并行方式的不同点 FPGA相比GPU的核心优势在于延迟 FPGA的并行有两种:数据并行(GPU 也有)和流水线并行 因为FPGA 在烧录的时候,假设每个数据包有10个步骤,FPGA可以直接搭建一个10级的流水线。每...

    FPGA结构

    1. FPGA与GPU 并行方式的不同点

    FPGA相比GPU的核心优势在于延迟

    FPGA的并行有两种:数据并行(GPU 也有)和流水线并行

    因为FPGA 在烧录的时候,假设每个数据包有10个步骤,FPGA可以直接搭建一个10级的流水线。每个处理完的数据包可以直接输出。
    联系CPU 和GPU的执行特点,都是取指,译指,执行。
    数据并行的方式是做10个计算单元。每个计算单元在处理不同的数据包,但是所有计算单元必须按照统一的步调,做相同的事情(SIMD)。例如做矩阵乘法,事情都是相同的,数据不同。这就要求10个数据包必须同进同出。

    因此,当任务是逐个而非成批到达的时候,流水线并行比数据并行可实现更低的延迟
    对与流水式计算的任务,FPGA比GPU天生有延迟方面的优势

    2. FPGA的kernel结构

    FPGA中的OpenCL有两种kernel结构:NDRange 和 Single-Work-Item
    NDRange核函数中由多个workitem并行执行,并且workitem间通过global memory 或 local memory进行共享数据。一个节拍会启动一个work item,这些work item以一种流水线的方式进行数据处理。这种结构的核函数代码风格类似GPU上的,但是实际的执行方式很不同。GPU上的workitem是以一种SIMD的方式执行,而FPGA上是MIMD,各级流水线对不同的数据包进行不同的处理。这里如果有数据依赖,那么执行的时候需要设置barrier function。在一个work group中的work item在继续往后执行时,必须先执行这个函数。因为FPGA的流水线结构,有数据依赖时,各个work item等待执行barrier function的开销比GPU 要大得多

    __kernel void vector_add(__global const float *a, 
                             __global const float *b, 
                             __global float *c)
    {
       int tid = get_global_id(0);
       c[tid] = a[tid] + b[tid];
    }
    
    

    Single-Work-Item类型的核函数结构类似CPU,核函数包含循环,并且循环的各个迭代间通过private memory进行共享数据。虽然只有一个work-item,但是各个循环迭代之间同样会以流水线的方式并行起来,就好像一个迭代对应于一级流水线。我们还是会利用FPGA的硬件条件做流水线并行。这里对循环展开的前提同样是各个迭代之前没有数据依赖。

    __kernel void vector_add(__global const float *a, 
                             __global const float *b, 
                             __global float *c)
    {
       for(int i = 0; i < SIZE; i++){
       		c[i] = a[i] + b[i];
       }
    }
    
    展开全文
  • 使用R并行方式对数值型数据离散化

    千次阅读 2016-08-21 22:51:57
    使用R并行方式对数值型数据离散化 数据的特征按照其取值可以分为连续型和离散型。离散数值属性在数据挖掘的过程中具有重要的作用。比如在信用卡评分模型中,当自变量很多时,并非所有字段对于目标字段来说都是有效...

                                                       使用R并行方式对数值型数据离散化

            数据的特征按照其取值可以分为连续型和离散型。离散数值属性在数据挖掘的过程中具有重要的作用。比如在信用卡评分模型中,当自变量很多时,并非所有字段对于目标字段来说都是有效的,因此通常的做法是通过计算woe值和iv值(类似于信息增益)来初步挑选通过对目标变量重要的字段,然后建模逻辑回归模型。而这当中就需要对数值型数据离散化。

           数值型数据离散化通常分为有监督离散化和无监督离散化。考虑到数据建模通常是建立目标字段和其影响因素之间的关系的量化,因此会选择有监督离散化。

           R语言中用于数值型数据离散化的包discretization。安装和加载如下:

    >install.packages("discretization")
    >library(discretization)
    

      以R自带数据集iris为例,以”Species” 为目标字段,对”Sepal.Length”、”Sepal.Width”、”Petal.Length” 、”Petal.Width” 四个数值型属性离散化。

     >lisan_result <- mdlp(iris)
     >class(lisan_result)
       [1] “list”
     >names(lisan_result)
       [1] “cutp” “Disc.data”

               使用mdlp()方法对iris离散化,该方法默认数据框最后一列最后为目标字段。返回结果为列表。”cutp”为各列的分割点向量。”Disc.data”为离散化后的数据框。

               该方法对于较小的样本量和维度时,程序运行时间还可以接受。但随着数据量的增大,数据维度的增加,程序运行时间会越来越长。因此考虑采用并行的方式对数据进行离散化。介绍R用于离散化的包parallel。

     >install.packages(“parallel”)
     >library(parallel)
     >cores <- detectCores() ##查看本机虚拟核心数
     > cores
        [1] 4

               现在考虑以并行的方式实现离散化方法。考虑设计思路如下:

               1.将字段10个为一组分别与目标字段组合成数据框,(不足10个时以实际数量字段与目标字段组合)存放在一个列表中。列表的元素即离散字段与目标字段构成的数据框。

               2.启动M个附属进程,并初始化。M<=本机虚拟核心数。使用parLapply()作用于步骤1中建立的列表数据。此时既有M个附属进程对数据进行离散化。

               3.将步骤2中的离散化结果合并。

               4.将上述步骤封装成函数。整理后使得返回结果与mdlp()函数一致。这样方便调用。

               将上述设计思路写成R代码,如下:输入离散数据、使用核心数,返回结果与使用mdlp()函数相同

    parallel_lisan <- function(lisan_data,cores_num){

       library(parallel)
       library(discretization

        res <- list()
       lisan_data_v <- list()
       cut_point <- list()
       Disc.data <- data.frame(c(rep(NA,nrow(lisan_data))))

       name_num = ncol(lisan_data)-1    ##将原始数据分割成多列,先考虑每组10列。不足的单独分为一组。
       group_num = floor(name_num/10)
       last_group_num = name_num%%10

       if( name_num > 10{       ##当原始数据列数多余10列
             for(i in 1:group_num){
                   lw_flag <- lisan_data[,ncol(lisan_data)]
                    lisan_data_v[[i]] <- cbind(lisan_data[,(10*i-9):>   (10*i)],lw_flag)
                   }
       lisan_data_v[[group_num+1]] <- lisan_data[,         (10*group_num+1):ncol(lisan_data)]
            }else{
           lisan_data_v[[group_num+1]] <- lisan_data[,(10*group_num+1):ncol(lisan_data)]
    }

        cl <- makeCluster(cores_num)     ##初始化核心
        results <- parLapply(cl,lisan_data_v,mdlp)     ##对列表数据使用mdlp函数并行离散化
        for(i in 1:length(results)){
            for(j in 1:length(results[[i]][[1]])){
                cut_point[[(i-1)*10+j]] <- results[[i]][[1]][[j]]
                      }
             temp <- as.data.frame(results[[i]][[2]])
             Disc.data <- cbind(Disc.data,temp[,1:(ncol(temp)-1)])         ##合并离散数据结果
       }

             Disc.data <- Disc.data[,2:ncol(Disc.data)]
             Disc.data$lw_flag <- lisan_data[,ncol(lisan_data)]
             names(Disc.data) <- names(lisan_data)
             stopCluster(cl)
             res[[“cutp”]] <- cut_point
             res[[“Disc.data”]] <- Disc.data

          return(res)
    }

    展开全文
  • 12864液晶并行方式显示

    千次阅读 2014-07-18 15:42:37
    与外部CPU接口采用并行或串行两种控制方式。 在12864上显示0-9的随机数 第二行显示www.csdn.blog 第三行显示“求是07的博客” 第四行显示“欢迎光临” 以下是主要的代码: #include <reg52.h> #...

    12864液晶使用的16*16点阵、128个字符(8*16点阵)及64*256点阵显示RAM(GDRAM).与外部CPU接口采用并行或串行两种控制方式。


    在12864上显示0-9的随机数 第二行显示www.csdn.blog

    第三行显示“求是07的博客”

    第四行显示“欢迎光临”

     

    以下是主要的代码:

    #include <reg52.h>
    #include <intrins.h>
    #include <stdlib.h>
    #define uchar unsigned char
    #define uint unsigned int
    #define LCD_data=P0;
    sbit rs=P3^5;
    sbit wr=P3^6;
    sbit en=P3^4;
    sbit rd=P3^7;
    sbit wela=P2^6;
    sbit dula=P2^7;
    uchar display1[10];
    uchar code display2[]={"www.csdn.blog.com"};
    uchar code display3[]={"求是07的博客"};
    uchar code display4[]={"欢迎光临"};
    void delay_1ms(uint x)
    {
    uint i,j;
    for(i=0;i<x;i++)
    for(j=0;j<100;j++);
    }
    
    
    void write_cmd(uchar cmd)
    {
    rs=0; 
    wr=0;
    en=0;
    P0=cmd;
    delay_1ms(5);
    en=1;
    delay_1ms(5);
    en=0;
    }
    
    
    void write_data(uchar dat)
    {
    rs=1;
    wr=0;
    en=0;
    P0=dat;
    delay_1ms(5);
    en=1;
    delay_1ms(5);
    en=0;
    }
    
    
    void lcd_pos(uchar X,uchar Y)
    {
    uchar pos;
    if(X==0)
    {X=0x80;}
    if(X==1)
    {
    X=0x90;
    }
    if(X==2)
    {
    X=0x88;
    }
    if(X==3)
    {
    X=0x98;
    }
    pos=X+Y;
    write_cmd(pos);
    }
    
    
    void makerand() //随机函数
    {
    uint ran;
    ran=rand();
    display1[0]=ran/10000+0x30;
    display1[1]=ran%10000/1000+0x30;
    display1[2]=ran%1000/100+0x30;
    display1[3]=ran%100/10+0x30;
    display1[4]=ran%10+0x30;
    ran=rand();
    display1[5]=ran/10000+0x30;
    display1[6]=ran%10000/1000+0x30;
    display1[7]=ran%1000/100+0x30;
    display1[8]=ran%100/10+0x30;
    display1[9]=ran%10+0x30;
    }
    
    
    void lcd_init()
    {
    rd=1; //设置 并口方式
    write_cmd(0x30);//这里设置基本指令动作
    delay_1ms(5); 
    write_cmd(0x0C);//显示开,光光标
    delay_1ms(5);
    write_cmd(0x01);//清屏
    delay_1ms(5);
    }
    main()
    {
    uchar i;
    wela=0;
    dula=0;
    delay_1ms(5);
    lcd_init();
    lcd_pos(1,0);
    i=0;
    while(display2[i]!='\0')
    {
    write_data(display2[i]);
    i++;
    }
    lcd_pos(2,0);
    i=0;
    while(display3[i]!='\0')
    {
    write_data(display3[i]);
    i++;
    }
    lcd_pos(3,0);
    i=0;
    while(display4[i]!='\0')
    {
    write_data(display4[i]);
    i++;
    }
    while(1)
    {
    lcd_pos(0,0);
    makerand();
    for(i=0;i<10;i++)
    {
    write_data(display1[i]);
    }
    }
    }

     

     

     

    展开全文
  • 注:两种并行方式结果虽然不等价,但不影响本问题分析的重点。 2 实验结果 实验平台:GTX 260 取M,N,I,J为256. 时间取10次运行平均值.粗细粒度并行运行时间相差1.7倍。 表1 实验结果(复杂运算pow, ...

    1 问题描述

    原代码:for(int m=0;m<M;m++)

                         for(intn=0;n<N;n++)

                                for(inti=0;i<I;i++)

                                       for(intj=0;j<J;j++)

                                       {

                                              //X条算术运算;(X=6)

                                              B[i][j]= pow(A[i][j],2);

                                              C[ij][]= sqrt(B[i][j]);

                                              ……

                                       }

    两种并行方式

    1 粗粒度并行:分成X个kernel函数,每个kernel函数里面做两层循环,内层循环并行打开,每个kernel执行一条算数运算。

                  Kernek_1:for(int m=0;m<M;m++)

                                       for(intn=0,n<N’n++)

                                       {

                                              B[i][j]= pow(A[i][j],2); //一条算术运算

                                       }

                  Kernek_2,……,kernek_X;

    2 细粒度并行:一个kernel函数,循环调用M*N次。Kernel里面做X条算术运算。

                  For(int m=0;m<M;m++)

                         For(intn=0;n<N;n++)

    Kernel://X条算术运算;(X=6)

                                              B[i][j]= pow(A[i][j],2);

                                              C[ij][]= sqrt(B[i][j]);

                                              ……

    注:两种并行方式结果虽然不等价,但不影响本问题分析的重点。

    2 实验结果

    实验平台:GTX 260

    取M,N,I,J为256.  时间取10次运行平均值.粗细粒度并行运行时间相差1.7倍。

    表1 实验结果(复杂运算pow, sqrt,sin, cos, tan, log; 简单运算+-*/+-)

    时间(ms)

    复杂运算

    复杂运算快速版

    简单运算

    粗粒度并行

    5206

    4463

    4609

    细粒度并行

    2996

    2515

    2661

    3 性能分析

    粗粒度并行调用kernel6次,细粒度并行调用kernel  256*256=65536次,但是粗粒度并行kernel函数有两次for循环。通过分析ptx文件发现每次for循环需要add/move/step/bra四条指令。因此for循环带来的指令开销影响的程序的性能,而kernel函数调用所带来的开销在此成为次要因素

    4 算术运算占用硬件资源

    通过分析cubin文件发现:

    powf/sqrtf/logf不占用local memory,而三角函数sinf/cosf/tanf使用了28B local memory。

    这些函数的快速版本都不占用localmemory,他们的执行开销相当于简单算术运算。

    至于复杂运算快速版本比简单运算时间略小,可能因为除法指令时间开销稍大。

    5 粗粒度并行改进

    对粗粒度并行的X个kernel合并为一个kernel,当X较大的时候可能会因为硬件资源限制影响效率,但是本实验室中X取6时合并为一个kernel,效率有一定的提升,这是因为还没有收到硬件资源的限制,比如寄存器不够强制使用local memory等。

    对于简单算术运算的一组测试结果:

    粗粒度并行    4046ms

    细粒度并行    2505ms

    开销之比      1.6倍

    这是因为for循环所带来的指令开销减少的原因。

    展开全文
  • 数据并行和模型并行的区别

    千次阅读 2020-04-28 13:15:04
    为了在一个巨大的数据集上训练一个复杂的深度学习模型,我们不得不使用多节点的并行方式,否则我们永远不可能达到这个目的。这里谈到的并行,通常指的有两种,或者它们各自的混合: 数据并行 (Data Parallel) 模型...
  • 并行计算实现方式

    2020-05-20 13:46:07
    单指令流多数据流是一种采用一个控制器来控制多个处理器,同时对一组数据(又称“数据矢量”)中的每一个分别执行相同的操作从而实现空间上的并行性的技术。 对称多处理机SMP SMP(Symmetric multiprocessing,对称...
  • Tensorflow实现多GPU并行

    千次阅读 2018-03-30 16:11:38
    Tebsorflow开源实现多GPU训练cifar10数据集:...模型并行需要根据不同模型设计不同的并行方式,其主要原理是将模型中不同计算节点放在不同硬件资源上运算。比较通用且能简便地实现大规模并行的方式是数据并行,同时...
  • 并行计算有哪些实现方式

    千次阅读 2020-05-20 13:24:16
    转载至并行计算简介 并行计算 Intel指令集中MMX,SSE,SSE2,SSE3和SSE4指的是什么? MMX(Multi Media eXtension,多媒体扩展指令集)是一些整数并行运算指令。...并行计算有哪些实现方式? 单指令多数据流SIMD、
  • 任务并行的几种方式

    千次阅读 2013-10-08 21:15:34
    一系列的任务能够并行的无冲突的分配给若干任务处理机处理,我们把这种任务的处理方式成为并行任务处理。 并行任务的处理关键在过各个处理机处理的任务处理互相独立,也就是构建一个无冲突的任务环境。最简单的...
  • tensorflow多gpu并行计算

    万次阅读 2017-10-14 11:17:11
    TensorFlow可以可以利用GPU加速深度学习模型的训练过程,在这里介绍一下利用多个GPU或者机器时,TensorFlow是如何进行多GPU...数据并行是比较通用简便的实现大规模并行方式,同时使用多个硬件资源计算不同batch数据梯度
  • 串行数据是各数据位按顺序进行,并行是各数据位同时传送
  • 并行通信源同步方式介绍

    千次阅读 2018-01-12 18:18:24
    我们都知道源同步方式的典型代表是DDRx信号,下面就来介绍源同步方式是怎样改善系统同步的先天不足的。 源同步要解决的第一个问题是减少在芯片之间传输数据所需的I/O引脚数量。这通过将芯片#1的输出处的n位数据...
  • Matlab的parfor并行编程

    万次阅读 2014-07-28 17:28:59
    Matlab的parfor并行编程 通常消耗最多计算资源的程序往往是循环。把循环并行化,或者优化循环...由for关键字引导的循环通常为串行运行,如果改为parfor则可以由多个worker以并行方式执行。parfor可以将n次循环分解为
  • Tensorflow分布式并行策略

    万次阅读 2016-11-30 19:48:43
    tensorFlow中主要包括了三种不同的并行策略,其分别是数据...数据并行又可以根据其更新参数的方式分为同步数据并行和异步数据并行,同步的数据并行方式如图所示,tensorflow图有着很多的部分图模型计算副本,单一的客
  • 最简单的 python 并行实现方式

    千次阅读 2017-02-16 11:39:41
    在介绍如何最简单地利用 python 实现并行前,我们先来看一个简单的代码。 1 2 3 words = ['apple', 'bananan', 'cake', 'dumpling'] for word in words: print word 上面的例子中,我们用一个...
  • 8255 1 方式并行接口设计

    千次阅读 2016-06-08 13:56:22
    甲乙微机并行传送1kb数据,甲发送1方式,乙接收0方式。 甲发送: mov dx,,303h ;命令端口 mov al,10100000b ;初始化工作方式字,,1方式,a端口(pa0~pa7)0出, out dx,al mov al,00001101h ;置发送中断允许INTE=1...
  • 前言在看了一些大神的面经之后觉得第二遍读基础的话想一边实现一下代码,一边关注一下算法的优化和并行化实现,毕竟工业上还是和学术上有很大区别,了解到现在常用的有mapreduce | spark | mpi | ps | hive 这些里面...
  • 并行排序

    千次阅读 2019-04-20 14:05:34
    并行排序算法是计算机并行计算能力大大发展之后,为了提高排序效率而提出的算法。 原有的的排序算法都是给定了数据再进行排序,...并行排序的表示方式是排序网络,其主要构件就是Batcher比较器,通过组合比较器构建...
  • 由于复杂的数据依赖,LSTM评价很困难。LSTM的训练过程,在反向传播阶段...获取有关LSTM更通用信息,请查看优秀的 简介 (作者:Christopher)有关使用模型并行方式在多个GPUs上训练LSTM的资料,请查看 example...
  • 并行计算——并行软件

    千次阅读 2019-09-12 10:58:35
    并行软件 在运行共享内存系统时,会启动一个单独的进程,然后派生(fork)出多个线程,所以当我们谈论共享内存程序时,我们指的是正在执行任务的线程。 需要在进程、线程之间平均分配的任务从而满足使得每个进程/...
  • 使用并行流还是CompletableFuture(四)

    千次阅读 2018-08-19 21:52:43
    并行流和CompletableFuture 使用定制的执行器 结论 ...我们知道,对集合进行计算,可以使用并行和...如上篇博客中所讲到的getPrice()方法,使用并行方式处理,代码如下: public List&amp;amp;lt;Str...
  • 并行计算及并行算法

    万次阅读 多人点赞 2018-06-13 22:27:31
    一、并行计算  简单地说,并行计算就是在并行计算机上所做的计算。从普通意义上讲,它和常说的高性能计算、超级计算等是同义词。并行计算的初衷是为了努力仿真自然世界中一个序列中含有众多同时发生的、复杂且相关...
  • 并行计算

    2017-05-07 20:06:50
    维基百科: ...并行计算(英语:parallel computing)一般是指...在同时进行的前提下,可以将计算的过程分解成小部分,之后以并发方式来加以解决[1]。2.基本体系结构 相对于串行计算,并行计算可以划分成时间并行和空间
  • 串行和并行区别

    千次阅读 2013-06-25 21:52:24
    并行方式主要用于近距离通信。计算 机内的总线结构就是并行通信的例子。这种方法的优点是传输速度快,处理简单。 串行数据传输时,数据是一位一位地在通信线上传输的,先由具有几位总线的计算机内的发送设备...
  • 并行算法

    千次阅读 2019-04-23 19:22:44
    并行算法就是用多台处理机联合求解问题的方法和步骤,其运行过程是将给定的问题首先分解成若干个尽量相互独立的子问题,然后使用多台计算机同时求解他,从而最终求得原问题的解。 1.并行算法设计 并行算法设计...
  • 并行计算和并行计算机体系结构

    千次阅读 2017-12-27 09:39:59
    关于并行你知道多少思考多少 冯诺依曼计算机体系结构 什么是并行计算 为什么用并行计算 谁在用并行计算 硬件提供了哪些支持 软件提供了哪些支持 总结 参考资料关于并行,你知道多少?思考多少?听到“并行”这个词汇...
  • C# 并行编程 之 PLINQ 执行MapReduce算法

    千次阅读 2015-06-08 08:49:21
    基本信息MapReduce(映射和规约)也称 Map/Reduce 或 Map & Reduce,充分运用并行方式处理大数据集。
  • 在大规模机器学习中,需要应对巨大的训练数据及计算量。当单机遇到性能瓶颈时需要通过多台机器并行训练来弥补计算能力与内存的不足。采用并行方式进行机器学习时,常常分为模型并行与数据并行。
  • 首先,必须搞清楚他们的分类和从属关系: 按数据传输的顺序可以分为串并行通信(传输)和串行通信(传输); 按数据传输的同步方式可分为同步传输和异步传输,而同步和异步同属于串行通信,是...并行方式传输数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 470,195
精华内容 188,078
关键字:

并行方式