2017-01-16 11 views
0

プログラムからのすべてのアクセスが(L1/L2キャッシュにデータが見つかったとしても)グローバルメモリにアクセスしたい。すべてのアクセスをCUDAのグローバルメモリに向けるにはどうすればよいですか?

-Xptxas -dlcm=cg 

CUDAドキュメントの状態この:このために私は、L1キャッシュがコンパイラNVCCするには、これらのオプションを渡すことでスキップすることができることが分かったので、

.cv Cache as volatile (consider cached system memory lines stale, fetch again). 

を、私はどちらかで実行するとき、私は想定しています - dlcm = cgまたは-dlcm = cvの場合、生成されるPTXファイルは正常に生成されたファイルとは異なるはずです。 (負荷が.cgまたは.cvのいずれかを付加する必要があります)

私のサンプルプログラム:

__global__ void rh_kernel(int *datainRowX, int *datainRowY) { 
    int tid = blockIdx.x * blockDim.x + threadIdx.x; 
    if (tid != 0) 
     return; 
    int i, x, y; 
    x = datainRowX[1]; 
    y = datainRowY[2]; 
    datainRowX[0] = x + y; 
} 

int main(int argc, char** argv) { 
    int* d_datainRowX; 
    cudaMalloc((void**)&d_datainRowX, sizeof(int) * 268435456); 

    int* d_datainRowY; 
    cudaMalloc((void**)&d_datainRowY, sizeof(int) * 268435456); 

    rh_kernel<<<1024, 1>>>(d_datainRowX, d_datainRowY); 
    cudaFree(d_datainRowX); cudaFree(d_datainRowY); 
    return(0); 
} 

が、私は何のオプション私はNVCCコンパイラに渡すことに注意してください(「-Xptxas -dlcm = CG」または"-Xptxas -dlcm = cv"または何もない)、生成されたPTXの3つのケースすべてで同じです。私はPTXファイルを生成するために-ptxオプションを使用しています。 私は何が欠けていますか?私がやっていることを達成するための他の方法はありますか? お時間をいただきありがとうございます。 Cuda Toolkit Documentationによれば

+0

どのGPUを使用していますか(どのcc)ですか? – pSoLT

+0

私はTesla K40を使用しています –

+0

そしてnvccバージョン6.5.12 –

答えて

1

ケプラーのGPUにおけるL1キャッシュは、ローカルメモリ用に予約されているが、そのようなレジスタスピルとスタックデータとして にアクセスします。グローバルロードはL2 (または読み取り専用データキャッシュ)にのみキャッシュされます。そのようなテスラK40 GPUアクセラレータ、GK20A、 とGK210として

GK110Bベースの製品

L1キャッシュは、グローバルメモリには使用されないデフォルトでは、この動作を保持するデフォルトでケプラーに読み出します。したがって、-Xptxas -dlcm=cgを追加すると、PTXに違いはありません。

L2キャッシュを無効にすることはできません。

+0

ありがとうございます。なぜ使用すると違いはありません -Xptxas -dlcm = cv これはグローバルメモリに直接アクセスするのに使用されていませんか? –

+0

.cvキャッシュは揮発性です(キャッシュされたシステムメモリ行が無効であるとみなし、再度フェッチします)。 –

+0

編集:すべてのアクセスがグローバルメモリにも移動する限り、L2を無効にしないでも問題ありません。したがって、私が.cvを使用できるかどうか疑問に思っていた –

関連する問題