日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

GPU 内存的分级综述(gpu memory hierarchy)

發布時間:2025/4/16 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GPU 内存的分级综述(gpu memory hierarchy) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GPU 內存的分級(gpu memory hierarchy)

小普 中科院化學所在讀博士研究生

研究課題,計算機模擬并行軟件的開發與應用

Email:? yaopu2019@126.com (歡迎和我討論問題)

CSDN:

博客園:

摘要(Abstact)

GPU 的存儲是多樣化的, 其速度和數量并不相同,了解GPU存儲對于程序的性能調優有著重要的意義。本文介紹如下幾個問題:

1.內存類型有什么?2)查詢自己設備的內存大小 3)內存訪問速度4)不同級別的存儲關系5)使用注意事項。各種存儲結構的優缺點。

?

正文

GPU結構圖

?

?

寄存器內存(Register memory)

優點:訪問速度的冠軍!

缺點:數量有限

使用:在__global__函數 ,或者___device__ 函數內,定義的普通變量,就是寄存器變量。

例子:

//kernel.cu__global__ void register_test(){int a = 1.0;double b = 2.0;}//main.cuint main(){int nBlock = 100;register_test <<<nBlock,128>>>();return 0;}

?

共享內存(Shared memory

優點:

1緩存速度快 比全局內存 快2兩個數量級

2 線程塊內,所有線程可以讀寫。

?3 生命周期與線程塊同步

缺點:大小有限制

使用:關鍵詞 __shared__ ?如 __shared__ double A[128];

適用條件:

使用場合,如規約求和 : a = sum A[i]

如果不是頻繁修改的變量,比如矢量加法。

是編程優化中的重要手段!

C[i] = A[i] + B[i] 則沒有必要將A,B進行緩存到shared memory 中。

?

//kernel.cu__global__ void shared_test(){__shared__ double A[128];int a = 1.0;double b = 2.0;int tid = threadIdx.x;A[tid] = a;}

?

③全局內存 (Global Memory)

優點:

1空間最大(GB級別)

2.可以通過cudaMemcpy 等與Host端,進行交互。

3.生命周期比Kernel函數長

4.所有線程都能訪問

缺點:訪存最慢

//kernel.cu__global__ void shared_test(int *B){double b = 2.0;int tid = threadIdx.x;int id = blockDim.x*128 + threadIdx.x;int a = B[id] ;}

?

④紋理內存

優點,比普通的global memory 快

缺點:使用起來,需要四個步驟,麻煩一點

適用場景:比較大的只需要讀取array,采用紋理方式訪問,會實現加速

使用的四個步驟(這里以1維float數組為例子),初學者,自己手敲一遍代碼!!!

第一步,聲明紋理空間,全局變量:

texture<float, 1, cudaReadModeElementType> tex1D_load;

第二步,綁定紋理

?

?

聲明語句:

#include <iostream>#include <time.h>#include <assert.h>#include <cuda_runtime.h>#include "helper_cuda.h"#include <iostream>#include <ctime>#include <stdio.h>using namespace std;texture<float, 1, cudaReadModeElementType> tex1D_load;//第一步,聲明紋理空間,全局變量__global__ void kernel(float *d_out, int size){//tex1D_load 為全局變量,不在參數表中int index;index = blockIdx.x * blockDim.x + threadIdx.x;if (index < size){d_out[index] = tex1Dfetch(tex1D_load, index); //第三步,抓取紋理內存的值//從紋理中抓取值printf("%f\n", d_out[index]);}}int main(){int size = 120;size_t Size = size * sizeof(float);float *harray;float *d_in;float *d_out;harray = new float[size];checkCudaErrors(cudaMalloc((void **)&d_out, Size));checkCudaErrors(cudaMalloc((void **)&d_in, Size));//initial host memoryfor (int m = 0; m < 4; m++){printf("m = %d\n", m);for (int loop = 0; loop < size; loop++){harray[loop] = loop + m * 1000;}//拷貝到d_in中checkCudaErrors(cudaMemcpy(d_in, harray, Size, cudaMemcpyHostToDevice));//第二步,綁定紋理checkCudaErrors(cudaBindTexture(0, tex1D_load, d_in, Size));//0表示沒有偏移int nBlocks = (Size - 1) / 128 + 1;kernel<<<nBlocks, 128>>>(d_out, size); //第三步cudaUnbindTexture(tex1D_load);???????? //第四,解紋理getLastCudaError("Kernel execution failed");checkCudaErrors(cudaDeviceSynchronize());}delete[] harray;cudaUnbindTexture(&tex1D_load);checkCudaErrors(cudaFree(d_in));checkCudaErrors(cudaFree(d_out));return 0;}

?

總結如下表

?

結束語

小普 中科院化學所在讀博士研究生

研究課題,計算機模擬并行軟件的開發與應用

Email:? yaopu2019@126.com (歡迎和我討論問題,私信和郵件都OK!)

讓程序使得更多人受益!

參考文獻

  • CUDA專家手冊 GPU編程權威指南 [M] 2014
  • CUDA Toolkit Documentation v10.1.168 https://docs.nvidia.com/cuda/
  • 總結

    以上是生活随笔為你收集整理的GPU 内存的分级综述(gpu memory hierarchy)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。