Научно-образовательный IT-форум при КНИТУ-КАИ

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] NVIDIA CUDA и профилировщик


[+] NVIDIA CUDA и профилировщик

Сообщений 1 страница 6 из 6

1

Очень интересен вопрос в отношении профилировщика в NVIDIA CUDA. Как его запустить и анализировать? Так, например, меня интересует вопрос: какое количество регистров было задействовано при исполнении ядра? Полагаю, через профилировщик это можно выяснить, но как?

http://forumfiles.ru/files/000c/4b/84/26892.jpg Решение

2

Запустил профилировщик nvvp в c:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin\
и получил следующее сообщение:

nvprof log: C:\Users\Администратор\nvvp_workspace\.metadata\.plugins\com.nvidia.viper\launch\2\nvprof_5448.log
==5448== Error: Cannot create profiling file: C:\Users\Администратор\nvvp_workspace\.metadata\.plugins\com.nvidia.viper\launch\2\api_5448.log


Похожая проблема описана тут

Зашел в свойства папки:
https://bitbucket.org/landwatersun/forum/downloads/201711222037.jpg

Убрал галочку только для чтения, но зайдя в свойства папки она стоит вновь. :) Однако меня смущает еще другое, как несмотря на указанные свойства в папке nvvp_workspace\... профилировщик создает файл  nvprof_5448.log и при этом еще ругается на то, что мол файл создать не может?! :)

3

Проблему с правами решил, зайдя под доменным именем.

Теперь на очереди следующее сообщение :)

nvprof log: C:\Users\lws1\nvvp_workspace\.metadata\.plugins\com.nvidia.viper\launch\2\nvprof_4848.log
==4848== Warning: Unified Memory Profiling is not supported on devices of compute capability less than 3.0
==4848== Warning: Some profiling data are not recorded. Make sure cudaProfilerStop() or cuProfilerStop() is called before application exit to flush profile data.

4

Забыл отметить, рассмотрение вопроса провожу на карте Tesla C-2075.

1)

Warning: Unified Memory Profiling is not supported on devices of compute capability less than 3.0

Убираем галочку в свойствах профайлера.

https://bitbucket.org/landwatersun/forum/downloads/201711222038.jpg

2)

Warning: Some profiling data are not recorded. Make sure cudaProfilerStop() or cuProfilerStop() is called before application exit to flush profile data.

Применяем к нашему коду следующую конструкцию:

#include <cuda_profiler_api.h>
...
int main(){
  cudaProfilerStart();
  Вызов kernel
  cudaProfilerStop();
  cudaDeviceReset(); //explicitly destroys and cleans up all resources associated with the current device in the current process
  return 0;
}


В результате запустил в профайлере следующий код:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <cuda_profiler_api.h>

#include <stdio.h>

__global__ void kernel(int *A, int *B, int *C){
int tid = threadIdx.x + blockIdx.x * blockDim.x;
C[tid] = A[tid] + B[tid];
}
int main(){
int n = 512;
int *A, *B, *C;
cudaProfilerStart();
cudaMalloc(&A, n*n*sizeof(int));
cudaMalloc(&B, n*n*sizeof(int));
cudaMalloc(&C, n*n*sizeof(int));
kernel <<< 512, 512 >>>(A, B, C);
cudaDeviceSynchronize();
cudaProfilerStop();
return 0;
}


Получил картинку:
https://bitbucket.org/landwatersun/forum/downloads/201711222039.jpg

На этом рассмотрение профайлера не закончено. Я не до конца разобрался с его конфигурацией и не понял, как узнать количество регистров на нить, а также сколько нитей всего запущено? На досуге посмотрю видео и вернусь к этому вопросу позже.

5

http://forumfiles.ru/files/000c/4b/84/26892.jpg Разобрался. Ключ к разгадке лежал в неверном указании компилятору:

https://bitbucket.org/landwatersun/forum/downloads/201711222040.jpg

Ошибка типа "invalid device function" гарантирована. Глупо было заставить карту с  Compute capability = 2.0 [https://en.wikipedia.org/wiki/CUDA#Supported_GPUs] выполнить код, сформированный для устройства с  Compute capability = 3.0.

Запустил следующий код с верными указаниями компилятору:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <cuda_profiler_api.h>

#include <stdio.h>

__global__ void kernel(int *A, int *B, int *C)
{
    int tid = threadIdx.x + blockIdx.x * blockDim.x;
    C[tid] = A[tid] + B[tid];
}

int main(){
    cudaProfilerStart();
    int n = 512;
    int *A, *B, *C;
    cudaMalloc (&A, n * n * sizeof(int));
    cudaMalloc (&B, n * n * sizeof(int));
    cudaMalloc (&C, n * n * sizeof(int));
    kernel <<< 512, 512>>> (A, B, C);
    cudaDeviceSynchronize();
    cudaProfilerStart();
    cudaDeviceReset();
    printf("%s\n", cudaGetErrorString(cudaGetLastError()));
    return 0;
}


И вуаля :)

https://bitbucket.org/landwatersun/forum/downloads/201711222041.jpg

6

Кстати, компилятор указал такое же число регистров.

https://bitbucket.org/landwatersun/forum/downloads/201711222042.jpg


Вы здесь » Научно-образовательный IT-форум при КНИТУ-КАИ » Задачи и вопросы » [+] NVIDIA CUDA и профилировщик