Los Profilers (nvvp y nvprof) no muestran información de “Fallo de página”.
Estoy perfilando un código de prueba presentado en el artículo Memoria Unificada para Principiantes de CUDA en el foro de desarrolladores de NVIDIA.
Código:
#include <iostream>
#include <math.h>
// CUDA kernel to add elements of two arrays
__global__
void add(int n, float* x, float* y)
{
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for (int i = index; i < n; i += stride)
y[i] = x[i] + y[i];
}
int main(void)
{
int N = 1 << 20;
float* x, * y;
// Allocate Unified Memory -- accessible from CPU or GPU
cudaMallocManaged(&x, N * sizeof(float));
cudaMallocManaged(&y, N * sizeof(float));
// initialize x and y arrays on the host
for (int i = 0; i < N; i++) {
x[i] = 1.0f;
y[i] = 2.0f;
}
// Launch kernel on 1M elements on the GPU
int blockSize = 256;
int numBlocks = (N + blockSize - 1) / blockSize;
add << <numBlocks, blockSize >> > (N, x, y);
// Wait for GPU to finish before accessing on host
cudaDeviceSynchronize();
// Check for errors (all values should be 3.0f)
float maxError = 0.0f;
for (int i = 0; i < N; i++)
maxError = fmax(maxError, fabs(y[i] - 3.0f));
std::cout << "Max error: " << maxError << std::endl;
// Free memory
cudaFree(x);
cudaFree(y);
return 0;
}
PREGUNTA: Los resultados del perfilado presentado por el autor muestran información sobre “Faltas de Página” pero cuando ejecuto los perfiles nvprof
y nvvp
, no obtengo ninguna información sobre las faltas de página. ¿Hay alguna bandera o algo que deba establecerse explícitamente para obtener esa información?
Mi resultado de nvprof :
== 20160 == Profiling result :
Type Time(%) Time Calls Avg Min Max Name
GPU activities : 100.00 % 60.513us 1 60.513us 60.513us 60.513us add(int, float*, float*)
API calls : 81.81 % 348.14ms 2 174.07ms 1.5933ms 346.54ms cudaMallocManaged
16.10 % 68.511ms 1 68.511ms 68.511ms 68.511ms cuDevicePrimaryCtxRelease
1.34 % 5.7002ms 1 5.7002ms 5.7002ms 5.7002ms cudaLaunchKernel
0.66 % 2.8192ms 2 1.4096ms 1.0669ms 1.7523ms cudaFree
0.07 % 277.80us 1 277.80us 277.80us 277.80us cudaDeviceSynchronize
0.01 % 33.500us 3 11.166us 3.5000us 16.400us cuModuleUnload
0.00 % 19.800us 1 19.800us 19.800us 19.800us cuDeviceTotalMem
0.00 % 16.700us 101 165ns 100ns 900ns cuDeviceGetAttribute
0.00 % 9.2000us 3 3.0660us 200ns 8.2000us cuDeviceGetCount
0.00 % 3.1000us 1 3.1000us 3.1000us 3.1000us cuDeviceGetName
0.00 % 2.1000us 2 1.0500us 300ns 1.8000us cuDeviceGet
0.00 % 300ns 1 300ns 300ns 300ns cuDeviceGetLuid
0.00 % 200ns 1 200ns 200ns 200ns cuDeviceGetUuid
== 20160 == Unified Memory profiling result :
Device "GeForce GTX 1070 (0)"
Count Avg Size Min Size Max Size Total Size Total Time Name
64 128.00KB 128.00KB 128.00KB 8.000000MB 3.217900ms Host To Device
146 84.164KB 32.000KB 1.0000MB 12.00000MB 68.17800ms Device To Host
Mi resultado del perfilado nvvp :
davy.ai
No se requiere ninguna bandera o ajuste para obtener información de fallos de página de nvprof o nvvp. Es posible que el autor del código de prueba haya utilizado una versión diferente de CUDA o una herramienta de perfilado diferente para obtener la información de fallos de página. Otra posibilidad es que el hardware del sistema utilizado por el autor pueda ser diferente del hardware utilizado por la persona que ejecuta el código, lo que podría resultar en diferentes resultados de perfilado. Sin embargo, en el caso del código dado que utiliza Memoria Unificada, se espera que los Fallos de Página sean bajos o inexistentes.