1. 程式人生 > >CUDA共享記憶體的使用示例

CUDA共享記憶體的使用示例

 1 #include <cuda.h>
 2 #include <cuda_runtime.h>
 3 #include <device_launch_parameters.h>
 4 #include <device_functions.h>
 5 #include <iostream>
 6 #include <string>
 7 
 8 using namespace std;
 9 
10 #define imin(a,b) (a<b? a:b)
11 const int N = 33 * 1024;
12 const
int threadsPerBlock = 256; 13 const int blocksPerGrid = imin(32, (N + threadsPerBlock - 1) / threadsPerBlock); 14 15 __global__ void dot(float *a, float *b, float *c) 16 { 17 __shared__ float cache[threadsPerBlock]; 18 int tid = threadIdx.x + blockDim.x*blockIdx.x; 19 int cacheIndex = threadIdx.x;
20 21 float temp = 0; 22 //每個執行緒負責計算的點乘,再加和 23 while (tid<N) 24 { 25 temp += a[tid] * b[tid]; 26 tid += blockDim.x*gridDim.x; 27 } 28 29 //每個執行緒塊中執行緒計算的加和儲存到緩衝區cache,一共有blocksPerGrid個緩衝區副本 30 cache[cacheIndex] = temp; 31 //對執行緒塊中的執行緒進行同步 32 __syncthreads();
33 34 //歸約運算,將每個緩衝區中的值加和,存放到緩衝區第一個元素位置 35 int i = blockDim.x / 2; 36 while (i != 0) 37 { 38 if (cacheIndex < i) 39 { 40 cache[cacheIndex] += cache[cacheIndex + i]; 41 } 42 __syncthreads(); 43 i /= 2; 44 } 45 //使用第一個執行緒取出每個緩衝區第一個元素賦值到C陣列 46 if (cacheIndex == 0) 47 { 48 c[blockIdx.x] = cache[0]; 49 } 50 } 51 52 void main() 53 { 54 float *a, *b, c, *partial_c; 55 float *dev_a, *dev_b, *dev_partial_c; 56 57 //分配CPU記憶體 58 a = (float*)malloc(N * sizeof(float)); 59 b = (float*)malloc(N * sizeof(float)); 60 partial_c = (float*)malloc(blocksPerGrid * sizeof(float)); 61 62 //分配GPU記憶體 63 cudaMalloc(&dev_a, N * sizeof(float)); 64 cudaMalloc(&dev_b, N * sizeof(float)); 65 cudaMalloc(&dev_partial_c, blocksPerGrid * sizeof(float)); 66 67 float sum = 0; 68 for (int i = 0; i < N; i++) 69 { 70 a[i] = i; 71 b[i] = i * 2; 72 } 73 74 //將陣列上傳到GPU 75 cudaMemcpy(dev_a, a, N * sizeof(float), cudaMemcpyHostToDevice); 76 cudaMemcpy(dev_b, b, N * sizeof(float), cudaMemcpyHostToDevice); 77 78 dot << <blocksPerGrid, threadsPerBlock >> > (dev_a, dev_b, dev_partial_c); 79 80 cudaMemcpy(partial_c, dev_partial_c, blocksPerGrid * sizeof(float), cudaMemcpyDeviceToHost); 81 82 //CPU 完成最終求和 83 c = 0; 84 for (int i = 0; i < blocksPerGrid; i++) 85 { 86 c += partial_c[i]; 87 } 88 89 #define sum_squares(x) (x*(x+1)*(2*x+1)/6) 90 printf("does GPU value %.6g = %.6g?\n", c, 2 * sum_squares((float)(N - 1))); 91 92 cudaFree(dev_a); 93 cudaFree(dev_b); 94 cudaFree(dev_partial_c); 95 96 free(a); 97 free(b); 98 free(partial_c); 99 }

相關推薦

CUDA共享記憶體的使用示例

1 #include <cuda.h> 2 #include <cuda_runtime.h> 3 #include <device_launch_parameters.h> 4 #include <device_functions.h> 5 #in

CUDA 共享記憶體 bank conflict

1. bank conflict 本文所有的實驗針對 GTX980 顯示卡,Maxwell 架構,計算能力 5.2。 GPU 共享記憶體是基於儲存體切換的架構(bank-switched-architecture)。在 Femi,Kepler,Maxwell 架構的裝置上有 3

cuda共享記憶體,全域性記憶體,紋理等的解釋

      開始閱讀粗大資料感覺文獻1的描述講得明白,摘錄到這裡方便他人瞭解。 增加簡單排版後,摘錄 1.共享記憶體 目前 CUDA 裝置中,每個 multiprocessor 有 16KB 的 shared memory。 Shared memory 分成16 個 ba

CUDA共享內存的使用示例

blocks col all square 歸約 如果 ont 位置 nload CUDA共享內存使用示例如下:參考教材《GPU高性能編程CUDA實戰》。P54-P65 教材下載地址:http://download.csdn.net/download/yizhaoyanbo

CUDA程式設計(七)共享記憶體與Thread的同步

https://blog.csdn.net/sunmc1204953974/article/details/51078818   CUDA程式設計(七) 共享記憶體與Thread的同步 在之前我們通過block,繼續增大了執行緒的數量,結果還是比較令人滿意的,但是也產生了一

Ubuntu 16.04 samba共享homes示例

syn ole ubuntu sts rsh file users cti smbd Ubuntu 16.04 samba共享homes示例: 註:1、global下加security = user (只有經過認證的才能訪問)2、 unix password syn

以佇列的形式使用共享記憶體

共享記憶體允許多個程序使用某一段儲存區,資料不需要在程序之間複製,多個程序都把該記憶體區域對映到自己的虛擬地址空間,直接訪問該共享記憶體區域,從而可以通過該區域進行通訊,是一種速度很快IPC。 下面是共享記憶體對映圖 一般描述使用共享記憶體,都是以普通緩衝區的形式訪問,這裡

windows 驅動開發 MDL 核心層 使用者層共享記憶體

參考資料    https://blog.csdn.net/wdykanq/article/details/7752909    http://blog.51cto.com/laokaddk/404584   核心層建立記憶體對映使用者層 PVOID

ython實現程序間的通訊有Queue,Pipe,Value+Array等,其中Queue實現多個程序間的通訊,而Pipe實現兩個程序間通訊,而Value+Array使用得是共享記憶體對映檔案的方式,所以速度比較快

1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #新增資料函式 def proc_write(queue,urls): print("程序(%s)正在寫入..."%(os.getpid()))

Linux-程序通訊-訊息佇列/訊號燈/共享記憶體

訊息佇列     訊息佇列提供了程序間傳送資料塊的方法,每個資料塊都可以被認為是有一個型別,接受者接受的資料塊可以有不同的型別;我們可以通過傳送訊息來避免命名管道的同步和阻塞問題;訊息佇列與命名管道一樣,每個資料塊都有一個最大長度的限制;我們可以將每個資料塊當作是一

風河虛擬化元件使用說明(15)—— 為Windows系統安裝VNIC驅動及共享記憶體驅動(on target)

參考Guest Guide文件"Windows VNIC Driver Overview"和"Windows Shared Memory Driver Overview" 首先將Windows 10作為GuestOS啟動:  進入WindShare網站(http://wind

c/c++ linux 程序間通訊系列4,使用共享記憶體

linux 程序間通訊系列4,使用共享記憶體 1,建立共享記憶體,用到的函式shmget, shmat, shmdt 函式名 功能描述 shmget 建立共享記憶體,返回pic key

檔案記憶體對映mmap解決大檔案快速讀寫問題和程序間共享記憶體

mmap函式主要用途有三個: 1、將一個普通檔案對映到記憶體中,通常在需要對檔案進行頻繁讀寫時使用,這樣用記憶體讀寫取代I/O讀寫,以獲得較高的效能; 2、將特殊檔案進行匿名記憶體對映,可以為關聯程序提供共享記憶體空間; 3、為無關聯的程序提供共享記憶體空間,一般也是將一個普通檔案對映到

程序間通訊(三)共享記憶體

概念: 共享記憶體區是最快的IPC形式。⼀一旦這樣的記憶體對映到共享它的程序的地址空間,這些程序間資料傳遞不再 涉及到核心,換句話說是程序不再通過執⾏行進⼊入核心的系統調⽤用來傳遞彼此的資料。 共享記憶體中的函式: shmget函式: 功能:⽤用來建立共享記憶體 原型

Linux:程序間通訊(匿名管道命名管道)(共享記憶體,訊息佇列,訊號量)

目錄 程序間通訊的介紹 管道 匿名管道 原理: 程式碼實現 匿名管道特性 實現管道符 |  命名管道 命名管道特性 程式碼實現 管道讀寫規則 作業系統中ipc的相關命令 共享記憶體(重點) 生命週期: 程式碼實現 程式碼實現獲

作業系統(11)程序--程序通訊:訊號、管道、訊息佇列、共享記憶體

文章目錄 1. 程序通訊相關概念 1. 通訊流程、屬性、鏈路 2. 程序通訊方式:直接通訊、間接通訊 2. 程序通訊的機制 1. 訊號 2. 管道 3. 訊息佇列

ORA-04031 無法分配 12519000 位元組的共享記憶體 large pool , unknown obje

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++:通過C++程式碼簡單理解程序間的通訊機制:共享記憶體

下面用共享對映檔案的方式實現程序間通訊,程式碼可以執行。 一、淺理解 每個程序有自己獨立的空間,一個程序無法訪問其他程序的資料。就好像兩個是互不干涉的個體,想讓它們進行通訊(交換資料),就必須有一段它們都可以訪問到的空間,作為中間介質。在計算機中,可以存放資料的地方分為記憶體和硬

共享記憶體及其用mmap實現共享記憶體

一、什麼是共享記憶體 顧名思義,共享記憶體就是允許兩個不相關的程序訪問同一個邏輯記憶體。共享記憶體是在兩個正在執行的程序之間共享和傳遞資料的一種非常有效的方式。不同程序之間共享的記憶體通常安排為同一段實體記憶體。程序可以將同一段共享記憶體連線到它們自己的地址空間中,所有程序都可以訪問共享記

Linux(高階程式設計)8————程序間通訊4(共享記憶體

共享記憶體是什麼? 因為程序之間是相互獨立的,他們有各自程序地址空間,那麼他們需要通訊時就要藉助核心來為他們建立橋樑,像之前我們瞭解的管道、訊息佇列就是核心做的工作來為程序間通訊架的橋樑。共享記憶體也是核心為程序間通訊駕的一座橋樑,只不過這座橋樑比其他橋樑更優,共享記憶體是核心為需要通訊