色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CUDA編程共享內(nèi)存

冬至子 ? 來源:指北筆記 ? 作者:張北北 ? 2023-05-19 15:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Shared Memory

共享內(nèi)存是使用__shared__內(nèi)存空間說明符分配的

共享內(nèi)存預(yù)期要比全局內(nèi)存快得多它可以用作臨時存儲器(或軟件管理緩存),以最小化來自CUDA block 的全局內(nèi)存訪問 ,如下面的矩陣乘法示例所示。

下面的代碼示例是一個簡單的矩陣乘法實現(xiàn),它不利用共享內(nèi)存。每個線程讀取A的一行和B的一列,并計算C的相應(yīng)元素,如圖1所示。因此, A從全局內(nèi)存中讀取B的width次數(shù),B從全局內(nèi)存中讀取A的height次數(shù)

從左到右是x的方向,從上到下是y的方向。 (x,y) x是0-dim,y是1-dim,和正常的 shape 表示是反著的。

圖片

圖1 Matrix Multiplication without Shared Memory

// Matrices are stored in row-major order:
// M(row, col) = *(M.elements + row * M.width + col)
typedef struct {
    int width;
    int height;
    float* elements;
} Matrix;

// Thread block size
#define BLOCK_SIZE 16

// Forward declaration of the matrix multiplication kernel
__global__ void MatMulKernel(const Matrix, const Matrix, Matrix);

// Matrix multiplication - Host code
// Matrix dimensions are assumed to be multiples of BLOCK_SIZE
void MatMul(const Matrix A, const Matrix B, Matrix C)
{
    // Load A and B to device memory
    Matrix d_A;
    d_A.width = A.width; d_A.height = A.height;
    size_t size = A.width * A.height * sizeof(float);
    cudaMalloc(&d_A.elements, size);
    cudaMemcpy(d_A.elements, A.elements, size,
               cudaMemcpyHostToDevice);
    Matrix d_B;
    d_B.width = B.width; d_B.height = B.height;
    size = B.width * B.height * sizeof(float);
    cudaMalloc(&d_B.elements, size);
    cudaMemcpy(d_B.elements, B.elements, size,
               cudaMemcpyHostToDevice);

    // Allocate C in device memory
    Matrix d_C;
    d_C.width = C.width; d_C.height = C.height;
    size = C.width * C.height * sizeof(float);
    cudaMalloc(&d_C.elements, size);

    // Invoke kernel
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
    dim3 dimGrid(B.width / dimBlock.x, A.height / dimBlock.y);
    MatMulKernel<<

下面的代碼示例是一個利用共享內(nèi)存的矩陣乘法的實現(xiàn)。在這個實現(xiàn)中, 每個線程塊負責計算C的一個方陣子矩陣Csub,塊中的每個線程負責計算Csub中的一個元素 。如圖2所示, Csub等于兩個矩形矩陣的乘積:一個是與Csub具有相同行索引的維數(shù)(A.width, block_size)的子矩陣,另一個是與Csub具有相同列索引的維數(shù)(block_size, A.width)的子矩陣 。為了適應(yīng)設(shè)備的資源,這兩個矩形矩陣根據(jù)需要被分成多個尺寸為block_size的方陣,Csub被計算為這些方陣乘積的和。每一個乘積都是這樣執(zhí)行的:首先將兩個對應(yīng)的方陣從全局內(nèi)存加載到共享內(nèi)存,由一個線程加載每個矩陣的一個元素,然后讓每個線程計算乘積的一個元素。每個線程將每個產(chǎn)品的結(jié)果累積到一個寄存器中,并將結(jié)果寫入全局內(nèi)存。

圖片

圖2 Matrix Multiplication with Shared Memory

通過這種方式阻塞計算,我們利用了快速共享內(nèi)存的優(yōu)勢,并節(jié)省了大量全局內(nèi)存帶寬, 因為A只從全局內(nèi)存讀取(B.width / block_size)次,而B是讀取(a.height / block_size)次

前面代碼示例中的Matrix類型使用stride字段進行了擴充,以便子矩陣可以有效地用相同的類型表示__device__函數(shù)用于獲取和設(shè)置元素,并從矩陣中構(gòu)建任何子矩陣。

// Matrices are stored in row-major order:
// M(row, col) = *(M.elements + row * M.stride + col)
typedef struct {
    int width;
    int height;
    int stride; 
    float* elements;
} Matrix;

// Get a matrix element
__device__ float GetElement(const Matrix A, int row, int col)
{
    return A.elements[row * A.stride + col];
}

// Set a matrix element
__device__ void SetElement(Matrix A, int row, int col,
                           float value)
{
    A.elements[row * A.stride + col] = value;
}

// Get the BLOCK_SIZExBLOCK_SIZE sub-matrix Asub of A that is
// located col sub-matrices to the right and row sub-matrices down
// from the upper-left corner of A
 __device__ Matrix GetSubMatrix(Matrix A, int row, int col) 
{
    Matrix Asub;
    Asub.width    = BLOCK_SIZE;
    Asub.height   = BLOCK_SIZE;
    Asub.stride   = A.stride;
    Asub.elements = &A.elements[A.stride * BLOCK_SIZE * row
                                         + BLOCK_SIZE * col];
    return Asub;
}

// Thread block size
#define BLOCK_SIZE 16

// Forward declaration of the matrix multiplication kernel
__global__ void MatMulKernel(const Matrix, const Matrix, Matrix);

// Matrix multiplication - Host code
// Matrix dimensions are assumed to be multiples of BLOCK_SIZE
void MatMul(const Matrix A, const Matrix B, Matrix C)
{
    // Load A and B to device memory
    Matrix d_A;
    d_A.width = d_A.stride = A.width; d_A.height = A.height;
    size_t size = A.width * A.height * sizeof(float);
    cudaMalloc(&d_A.elements, size);
    cudaMemcpy(d_A.elements, A.elements, size,
               cudaMemcpyHostToDevice);
    Matrix d_B;
    d_B.width = d_B.stride = B.width; d_B.height = B.height;
    size = B.width * B.height * sizeof(float);
    cudaMalloc(&d_B.elements, size);
    cudaMemcpy(d_B.elements, B.elements, size,
    cudaMemcpyHostToDevice);

    // Allocate C in device memory
    Matrix d_C;
    d_C.width = d_C.stride = C.width; d_C.height = C.height;
    size = C.width * C.height * sizeof(float);
    cudaMalloc(&d_C.elements, size);

    // Invoke kernel
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
    dim3 dimGrid(B.width / dimBlock.x, A.height / dimBlock.y);
    MatMulKernel<<
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5433

    瀏覽量

    124306
  • 存儲器
    +關(guān)注

    關(guān)注

    38

    文章

    7648

    瀏覽量

    167210
  • CUDA
    +關(guān)注

    關(guān)注

    0

    文章

    122

    瀏覽量

    14113
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    內(nèi)存共享原理解析

    內(nèi)存共享是一種在多個進程之間共享數(shù)據(jù)的機制,它允許不同的進程直接訪問同一塊內(nèi)存區(qū)域,從而實現(xiàn)數(shù)據(jù)的快速傳遞和通信。
    的頭像 發(fā)表于 02-19 15:11 ?1806次閱讀
    <b class='flag-5'>內(nèi)存</b><b class='flag-5'>共享</b>原理解析

    CUDA編程教程

    Nvidia CUDA 2.0編程教程
    發(fā)表于 03-05 07:30

    cuda程序設(shè)計

      •GPGPU及CUDA介紹   •CUDA編程模型   •多線程及存儲器硬件
    發(fā)表于 11-12 16:12 ?0次下載

    共享內(nèi)存IPC原理,Linux進程間如何共享內(nèi)存

    共享內(nèi)存是在內(nèi)存中單獨開辟的一段內(nèi)存空間,這段內(nèi)存空間有自己特有的數(shù)據(jù)結(jié)構(gòu),包括訪問權(quán)限、大小和最近訪問的時間等。該數(shù)據(jù)結(jié)構(gòu)定義如下
    的頭像 發(fā)表于 07-16 13:43 ?8912次閱讀
    <b class='flag-5'>共享</b><b class='flag-5'>內(nèi)存</b>IPC原理,Linux進程間如何<b class='flag-5'>共享</b><b class='flag-5'>內(nèi)存</b>?

    CUDA 6中的統(tǒng)一內(nèi)存模型

    的,并通過PCI-Express總線相連。在CUDA6之前, 這是程序員最需要注意的地方。CPU和GPU之間共享的數(shù)據(jù)必須在兩個內(nèi)存中都分配,并由程序直接地在兩個內(nèi)存之間來回復(fù)制。這給
    的頭像 發(fā)表于 07-02 14:08 ?3136次閱讀

    深入剖析Linux共享內(nèi)存原理

    不同進程之間進行通信,需要讓不同進程共享相同的物理內(nèi)存,Linux通過? 共享內(nèi)存 ?來實現(xiàn)這個功能。下面先來介紹一下Linux系統(tǒng)的共享
    的頭像 發(fā)表于 10-30 09:52 ?2530次閱讀
    深入剖析Linux<b class='flag-5'>共享</b><b class='flag-5'>內(nèi)存</b>原理

    通過使用CUDA GPU共享內(nèi)存

    共享內(nèi)存是編寫優(yōu)化良好的 CUDA 代碼的一個強大功能。共享內(nèi)存的訪問比全局內(nèi)存訪問快得多,因為
    的頭像 發(fā)表于 04-11 10:03 ?7880次閱讀

    CUDA簡介: CUDA編程模型概述

    CUDA 編程模型中,線程是進行計算或內(nèi)存操作的最低抽象級別。 從基于 NVIDIA Ampere GPU 架構(gòu)的設(shè)備開始,CUDA 編程
    的頭像 發(fā)表于 04-20 17:16 ?3352次閱讀
    <b class='flag-5'>CUDA</b>簡介: <b class='flag-5'>CUDA</b><b class='flag-5'>編程</b>模型概述

    CUDA編程模型的統(tǒng)一內(nèi)存

      內(nèi)存空間的統(tǒng)一意味著主機和設(shè)備之間不再需要顯式內(nèi)存傳輸。在托管內(nèi)存空間中創(chuàng)建的任何分配都會自動遷移到需要的位置。
    的頭像 發(fā)表于 05-07 14:47 ?1632次閱讀

    Linux系統(tǒng)的共享內(nèi)存的使用

    但有時候為了讓不同進程之間進行通信,需要讓不同進程共享相同的物理內(nèi)存,Linux通過 共享內(nèi)存 來實現(xiàn)這個功能。下面先來介紹一下Linux系統(tǒng)的共享
    的頭像 發(fā)表于 11-14 11:55 ?1579次閱讀

    使用CUDA進行編程的要求有哪些

    CUDA是NVIDIA的一種用于GPU編程的技術(shù),CUDA核心是GPU上的一組小型計算單元,它們可以同時執(zhí)行大量的計算任務(wù)。
    的頭像 發(fā)表于 01-08 09:20 ?2858次閱讀

    介紹CUDA編程模型及CUDA線程體系

    CUDA 編程模型主要有三個關(guān)鍵抽象:層級的線程組,共享內(nèi)存和柵同步(barrier synchronization)。
    的頭像 發(fā)表于 05-19 11:32 ?2472次閱讀
    介紹<b class='flag-5'>CUDA</b><b class='flag-5'>編程</b>模型及<b class='flag-5'>CUDA</b>線程體系

    CUDA編程分布式共享內(nèi)存

    計算能力9.0中引入的線程塊集群為線程塊集群中的線程提供了訪問集群中所有參與線程塊的共享內(nèi)存的能力。
    的頭像 發(fā)表于 05-19 15:35 ?1637次閱讀

    Linux進程間如何實現(xiàn)共享內(nèi)存通信

    在上面的例程中,我們首先使用ftok()函數(shù)生成一個key值作為共享內(nèi)存的標識符。然后使用shmget()函數(shù)創(chuàng)建共享內(nèi)存區(qū)域,shmaddr指向
    發(fā)表于 06-19 09:55 ?791次閱讀

    CUDA核心是什么?CUDA核心的工作原理

    CUDA核心(Compute Unified Device Architecture Core)是NVIDIA圖形處理器(GPU)上的計算單元,用于執(zhí)行并行計算任務(wù)。每個CUDA核心可以執(zhí)行單個線程的指令,包括算術(shù)運算、邏輯操作和內(nèi)存
    發(fā)表于 09-27 09:38 ?1w次閱讀
    <b class='flag-5'>CUDA</b>核心是什么?<b class='flag-5'>CUDA</b>核心的工作原理
    主站蜘蛛池模板: 小小水蜜桃视频高清在线观看免费 | 羞羞在线观看 | 尤物yw193can入口 | 一个人在线观看免费中文www | 成人性生交大片免费看金瓶七仙女 | 老外的好大c的我好爽 | 绿巨人www在线观看 绿巨人www | 欧美一第一页草草影院 | 粉嫩AV国产一区二区福利姬 | 国产无遮挡色视频免费观看性色 | 四房播播开心色播 | 亚洲狠狠97婷婷综合久久久久 | 99九九精品国产高清自在线 | 狠狠色综合久久丁香婷婷 | 小s现场抛胸挤奶 | 久久视频这有精品63在线国产 | 国产精品久久欧美一区 | 窝窝午夜色视频国产精品东北 | 亚洲综合AV色婷婷五月蜜臀 | 国产成人在线视频网站 | 99国产在线精品观看二区 | 羞羞影院午夜男女爽爽影院网站 | 帅哥男男GV在线1080P | 国产www视频 | 国产69TV精品久久久久99 | 亚洲另类国产综合在线 | 小p孩玩成年女性啪啪资源 小777论坛 | 99热久久视频只有精品6国产 | 久久这里只有是精品23 | 日本在线高清不卡免费播放 | 国产偷国产偷亚洲高清SWAG | 欧美性受xxxx狂喷水 | 国产色精品久久人妻无码看片软件 | 久久久精品久久久久三级 | 久久九九青青国产精品 | 中文字幕在线观看亚洲日韩 | 欧洲最大无人区免费高清完整版 | av天堂网2014在线 | 91精品一区二区三区在线观看 | 日本粉嫩学生毛绒绒 | 欧美黑人巨大videos免费 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品