Ich versuche herauszufinden, was genau die von "nvprof" gemeldeten Messwerte sind. Genauer gesagt kann ich nicht herausfinden, welche Transaktionen Systemspeicher und Gerätespeicher lesen und schreiben. Ich habe einen sehr einfachen Code geschrieben, um das herauszufinden.Was genau sind die von NVPROF berichteten Transaktionsmetriken?
#define TYPE float
#define BDIMX 16
#define BDIMY 16
#include <cuda.h>
#include <cstdio>
#include <iostream>
__global__ void kernel(TYPE *g_output, TYPE *g_input, const int dimx, const int dimy)
{
__shared__ float s_data[BDIMY][BDIMX];
int ix = blockIdx.x * blockDim.x + threadIdx.x;
int iy = blockIdx.y * blockDim.y + threadIdx.y;
int in_idx = iy * dimx + ix; // index for reading input
int tx = threadIdx.x; // thread’s x-index into corresponding shared memory tile
int ty = threadIdx.y; // thread’s y-index into corresponding shared memory tile
s_data[ty][tx] = g_input[in_idx];
__syncthreads();
g_output[in_idx] = s_data[ty][tx] * 1.3;
}
int main(){
int size_x = 16, size_y = 16;
dim3 numTB;
numTB.x = (int)ceil((double)(size_x)/(double)BDIMX) ;
numTB.y = (int)ceil((double)(size_y)/(double)BDIMY) ;
dim3 tbSize;
tbSize.x = BDIMX;
tbSize.y = BDIMY;
float* a,* a_out;
float *a_d = (float *) malloc(size_x * size_y * sizeof(TYPE));
cudaMalloc((void**)&a, size_x * size_y * sizeof(TYPE));
cudaMalloc((void**)&a_out, size_x * size_y * sizeof(TYPE));
for(int index = 0; index < size_x * size_y; index++){
a_d[index] = index;
}
cudaMemcpy(a, a_d, size_x * size_y * sizeof(TYPE), cudaMemcpyHostToDevice);
kernel <<<numTB, tbSize>>>(a_out, a, size_x, size_y);
cudaDeviceSynchronize();
return 0;
}
Dann starte ich nvprof --metrics alle für die Ausgabe, um alle Metriken zu sehen. Dies ist der Teil, der mich interessiert:
Metric Name Metric Description Min Max Avg
Device "Tesla K40c (0)"
Kernel: kernel(float*, float*, int, int)
local_load_transactions Local Load Transactions 0 0 0
local_store_transactions Local Store Transactions 0 0 0
shared_load_transactions Shared Load Transactions 8 8 8
shared_store_transactions Shared Store Transactions 8 8 8
gld_transactions Global Load Transactions 8 8 8
gst_transactions Global Store Transactions 8 8 8
sysmem_read_transactions System Memory Read Transactions 0 0 0
sysmem_write_transactions System Memory Write Transactions 4 4 4
tex_cache_transactions Texture Cache Transactions 0 0 0
dram_read_transactions Device Memory Read Transactions 0 0 0
dram_write_transactions Device Memory Write Transactions 40 40 40
l2_read_transactions L2 Read Transactions 70 70 70
l2_write_transactions L2 Write Transactions 46 46 46
Ich verstehe die gemeinsamen und globalen Zugriffe. Die globalen Zugriffe sind vereinigt und da es 8 Warps gibt, gibt es 8 Transaktionen. Aber ich kann nicht die Systemspeicher- und Gerätespeicher-Schreibtransaktionsnummern herausfinden.
Danke für Ihre Antwort. Die Figur half ein wenig. Aber ich habe immer noch ein paar Probleme. Also verstehe ich nicht, warum es 4 Systemspeichertransaktionen für diesen Code gibt, und woher kommt der Rest von DRAM-Schreibtransaktionen? Dies ist ein sehr direkter Code, so dass ich keine unbekannten Transaktionen erwartet habe! –