共有メモリ(共有メモリ)は、メモリ(オンチップ)オンチップSM上に配置され、各SMは、メモリは比較的小さく、初期のGPUのみ16K(16384)であるものであり、現在一般生成GPUの48K(49152 )。
メモリは、(よりグローバルなメモリの点で)ので、高帯域幅、低遅延、オンチップメモリを共有しているので、共有メモリの使用の合理化が大幅にプログラムの効率を改善しました。
ここで閲覧することができます削減を合計するために、グローバルメモリを使用して加算され、共有メモリアレイの使用、あるhttps://www.cnblogs.com/xiaoxiaoyibu/p/11397205.htmlは
#PRAGMA一度 の#include " cuda_runtime.h " の#include " device_launch_parameters.h " の#include " device_functions.h " の#include <iostreamの> 使用して名前空間はstdを、CONSTのINT N = 128。 // 数组长度 __global__ 空隙 d_ParallelTest(ダブル *のパラ) { int型 TID = threadIdx.x。// ----使用、共有メモリ----------------------------------------- --------------------- __shared__ 二重 s_Para [N]; // 定義された長さN共有メモリアレイ IF(TID <N) // 配列をループし、各スレッドは、グローバル共有メモリからメモリ要素をロードする責任がある s_Paraは[TID] = パラ[TID ]; __syncthreadsの(); // (赤プロンプトVSが認識されない波線ので、動作には影響しない)、同期、自分の要素の共有メモリにロードされ、その後、次のコードで実行に責任があると、すべてのスレッドを待つ
ために(int型のインデックス= 1。 ;インデックス<blockDim.x; *インデックス= 2 ) {
__syncthreadsの(); //は同期、速すぎて計算を実行して還元処理スレッドを防ぐためには、間違っています(後スレッドスレッドが以前に誤った結果値を用いて算出)
IF(TID%(2 *指数)== 0 )
{
s_Para [TID] + = s_Para [+ TIDのインデックス];
}
}
IF(TIDの== 0 ) //配列全体付加は、共有メモリアレイ0完了した後に要素番号0の数の値は、グローバルメモリアレイ要素に割り当てられ、返されるCPU側
パラ[TID] = s_Para [TID]; } ボイドParallelTest(){ ダブル *のパラ; cudaMallocManaged((ボイド)**&パラ、はsizeof(ダブル) N *); // 均一なメモリアクセス、CPUとGPUを使用することができる ダブル ParaSum = 0
;
について(INT I = 0、I <Nで、Iは++ )
{
[I]はパラ =(私は+ 。1)* 0.1 ; // 配列代入
; + =パラ[I] ParaSumは // CPUは、累積配列終了
}
COUTを << " CPU結果は= " << ENDL << ParaSumが; // 表示CPU端結果
ダブルd_ParaSum;
d_ParallelTest << < 1、Nは>>>(パラ); // カーネルを呼び出す(Nスレッドは、スレッドブロックを含みます)
cudaDeviceSynchronize(); //端末装置待つ同期を
パラ= d_ParaSum [ 0 ]; // 蓄積した後に得られた結果から、アレイ内の0エレメント
COUT << " GPU結果= " ; << ENDL << d_ParaSum //はエンドGPUの結果を示す } int型のmain(){ // パラレル還元 ParallelTest(); システム(" PAUSE " ); 戻り0 ; }
(CPU及びGPU一貫した結果)結果は次の通りであります: