1. 程式人生 > >CUDA(五) 一個入門級求和並行演算法

CUDA(五) 一個入門級求和並行演算法

此部落格為博主的自學筆記 ,歡迎大家共同交流,如果有錯誤的地方歡迎留言指正。

在各種基礎演算法中,如排序,求極值,求和,求平均等等,如果用並行的方式進行的計劃顯然不是很難,但是對於硬體來講,如果想最大發揮出硬體的效能那並不是一件容易的事情。

此次先介紹一個簡單的並行求和演算法,並初步利用CUDA進行實現,雖然並沒有達到最佳的效果,但是為以後的優化進行一下鋪墊。

求和演算法:

    對 1,2,3,4,5,6,7,8,9 ,10,11,.....................,1024進行求和計算。

    這個計算雖然對CPU來講極其容易,但是對GPU來講,確實需要費一番工夫。

    一般來說,平行計算求和,最容易理解的無外乎就是相鄰兩人個數相加,再存到其中一個地址中,變成一個新的中間和數列。然後再重複上面的步驟,直到所有的收縮到一個地址中。在這裡,我們用括號() 來表示兩人個數的加和關係,和儲存到左邊的數的地址中。

     step1:   (1,2),  (3,4) ,(5,6),(7,8), (9, 10), (11,12),...........................(1023,1024)

        新陣列為:  3,2,7,4,11,6,15,8,................................................2047, 1024

     step2:    (3,7), (11,15),...........................(2043, 2047)

       新陣列為:,10, 7, 26,15, .......................4090,2047

    step3:   (10,26)........................

    以此類推,進行(>=log2N的最小整數 )次迴圈計算,將N個數不斷收縮到一個數中。例:N = 8時,迴圈3次, N=9時,迴圈4次。

下面為一段CUDA的核函式求和演算法程式碼:

        假定A_d中存在按地址順序依次儲存了0到1023的1024個數據。執行緒3維空間定義為(1024,1,1 ), 塊3維空間定義為(1,1,1) ,求和後,結果存在A_d的首地址中。

 __global__  void   sum(float *A_d){

    __shared__   float mem[1024];

        mem[threadIdx.x] = A_d[threadIdx.x]; //將global memory的資料複製到shared memory中

    for(int s = 1; s < blockDim.x; s*=2){ //迴圈(>=log2N的最小整數 )次,   S初始值為1,之後依次為2,4,8,16.....

        if(threadIdx.x%(2*s)==0){   //所有的偶數執行緒,開始為每隔兩個,之後依次為每隔4個,8個,16個,32個   

        mem[threadIdx.x]+= mem[threadIdx.x+s];     ·//將上次迴圈的相鄰兩和相加

        }

    __syhnthreads();                             //執行緒同期(很重要,如果不同期,相鄰的和就會讀取錯誤)

     }

    if(threadIdx.x==0){

        A_d[0] = mem[0];         //將和包存在global memory的首地址中

    }

}

相關推薦

CUDA 一個入門求和並行演算法

此部落格為博主的自學筆記 ,歡迎大家共同交流,如果有錯誤的地方歡迎留言指正。 在各種基礎演算法中,如排序,求極值,求和,求平均等等,如果用並行的方式進行的計劃顯然不是很難,但是對於硬體來講,如果想最大

MySQL學習之路MySQL高查詢

code left 功能 限定查詢 外鏈接 spa size 平均數 asc MySQL統計函數   count():統計數量;   max():統計最大值;   min():統計最小值;   avg():統計平均數;   sum():統計和; Select

Spring Boot實戰筆記-- Spring高話題Spring Aware

ktr mea 框架 .com cat 分享 aware war uic 一、Spring Aware   Spring 依賴註入的最大亮點就是你所有的 Bean 對 Spring容器的存在是沒有意識的。即你可以將你的容器替換成其他的容器,如Google Guice,這時

Dubbo Dubbo入門demo——helloworld

端口號 80端口 databind hot 找不到 body fun ide 說明 前言 前面我已經介紹了dubbo的一些基本工具和知識,讓大家簡單的了解了下RPC框架和Dubbo。接下來就是重點了,Dubbo的helloworld項目。 一、搭建項目 首先我們新建三個ma

NodeJS簡易部落格系統NodeJS入門學習

一、模組 在NodeJS中,一般將程式碼合理拆分到不同的JS檔案中,每一個檔案就是一個模組,而檔案路徑就是模組名。在編寫每個模組時,都有require、exports、module三個預先定義好的變數可供使用。 1、require require函式用於在當前模組中載入和使用別的模組,傳

Redux入門

1 Redux概念簡述 flux推出的時候有一些缺點。比如store可以存在多個,不是特別好用 於是逐漸進化為了redux。 2 Redux的工作流程     拿借書作舉例: action creators是”我要借書”這句話 store是圖書管理員 reduce

推薦Swift入門免費視訊

前言:推薦一個Swift入門者適合觀看的視訊,視訊總長度不到8小時,視訊包含基本Swift開發所需內容 2.具體介紹: (1)視訊講解: 風格:對比OC和Swift ,更易理解 內容:完

機器學習筆記 octave入門

   這一節我們主要用來熟悉octave的使用。    octave和matlab一樣,主要用來數值計算和模擬。尤其精於矩陣運算:求解聯立方程組,計算矩陣特徵值和特徵向量等等。    矩陣大小:size(A)  輸出:行m,列n                      

訊息中介軟體——RabbitMQ快速入門生產者與消費者,SpringBoot整合RabbitMQ!

前言 本章我們來一次快速入門RabbitMQ——生產者與消費者。需要構建一個生產端與消費端的模型。什麼意思呢?我們的生產者傳送一條訊息,投遞到RabbitMQ叢集也就是Broker。 我們的消費端進行監聽RabbitMQ,當發現佇列中有訊息後,就進行消費。 1. 環境準備 本次整合主要採用Spring

機器學習筆記續——樸素貝葉斯演算法的後驗概率最大化含義

  上一節中講了樸素貝葉斯演算法將例項分到後驗概率最大的類。這等價於期望風險最小化。 假設使用0-1損失函式: L(Y,f(X))={1,0,Y≠f(X)Y=f(X) 上式中的f(x)是分類決策函式, 這時,期望風險函式是: Rexp(f)=E[L(Y

Phaser3入門教程:第一個Phaser3遊戲中文版

加入角色 有了這些可愛的平臺,怎麼能沒人在上面跑動呢? 在create函式中,新建一個player變數,程式碼參看part5.html: player = this.physics.add.sprite(100, 450, 'dude');

CUDA入門到精通:執行緒並行

多執行緒我們應該都不陌生,在作業系統中,程序是資源分配的基本單元,而執行緒是CPU時間排程的基本單元(這裡假設只有1個CPU)。 將執行緒的概念引申到CUDA程式設計中,我們可以認為執行緒就是執行CUDA程式的最小單元,前面我們建立的工程程式碼中,有個核函式概念不知各位

python爬蟲從入門到放棄之 正則的基本使用

語言 代碼例子 name 添加 iter ima 制表符 imp things 什麽是正則表達式 正則表達式是對字符串操作的一種邏輯公式,就是 事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符”,這個“規則字符” 來表達對字符的一種過濾邏輯。 正則並不是

Python入門系列教程函數

st3 python入門 test print 缺省 .com 教程 技術 log 全局變量 修改全局變量 a=100 def test(): global a a=200 print a 多個返回值 缺省參數 d

Hibernate入門

brush cti ride pack ng- gin import source builds 一 Hibernate繼承映射   我們可以將繼承層次結構類與數據庫的表映射。 1. 每個層次類一張表 這個層次結構有三個類,Employee是Regular_Employ

hadoop入門筆記MapReduce Shuffle簡介

單位 海量數據 並行處理 詳細 但是 信息 不能 utf 適合 1. MapReduce 定義   Hadoop 中的 MapReduce是一個使用簡單的軟件框架,基於它寫出來的應用程序能夠運行在由上千個商用機器組成的大型集群上,並以一種可靠容錯式並行處理TB級別的數據集

Java反射機制demo—獲得並調用一個類中的方法

color 擁有 oca logs over super getmethod equals() bool 這個demo在使用反射機制操作屬性之前,主要原因是因為在.class文件字節碼中,方法排在屬性的前面。 1,獲得一個類中的方法 先看一下方法和運行結果。獲取所有的方

SQL Server 2005中的分區表:添加一個分區

eat 查詢 sch 另一個 rom 原創 查看 copyto art 所謂天下大事,分久必合,合久必分,對於分區表而言也一樣。前面我們介紹過如何刪除(合並)分區表中的一個分區,下面我們介紹一下如何為分區表添加一個分區。 為分區表添加一個分區,這種情況是時常會

WPF入門教程系列十——布局之Border與ViewBox

last () put prev 裝飾 wpf 背景 .text 部分 九. Border Border 是一個裝飾的控件,此控件繪制邊框及背景,在 Border 中只能有一個子控件,若要顯示多個子控件,需要將一個附加的 Panel 控件放置在父 Border 中。然後可以

Vue入門系列Vue實例詳解與生命周期

auto res context mode parent all from bool silent 【入門系列】 【本文轉自】   http://www.cnblogs.com/fly_dragon Vue的實例是Vue框架的入口,其實也就是前端的ViewM