mirror of
https://github.com/andreinechaev/nvcc4jupyter.git
synced 2026-06-14 03:00:47 +05:30
Add option to choose between NSYS and NCU profilers (#28)
* Add option to give nvcc extra arguments * Add test for nvcc options that changes c++ dialect from c++17 to c++14 * Add make and the english language pack to devcontainer to be able to build the documentation * Update documentation config to automatically import the current version of the package * Document new --compiler-args argument * Improve tests coverage by testing for bad arguments and the error output during a failed compilation * Add IPython to docs requirements to allow the __version__ import for readthedocs env * Change devcontainer base image to have the latest CUDA toolkit * Mock the nsight compute tool with a bash script * Add test to compile with opencv * Add new page to documentation that contains a new notebook that explains compiling with external libraries * Add autodocstring vscode extension to devcontainer * Add function that modifies the default profiler/compiler arguments to allow reusing them in multiple magic command calls * Update pylint exceptions * Update contributing instructions * Change version from 1.0.3 to 1.1.0 due to adding features in a backward-compatible manner * Install latest CUDA toolkit on the test runner to pass the OpenCV compilation test * Install opencv in test runner and update code coverage install * Add CUDA bin to PATH in test and coverage runners * Add cuda bin to path variable in .bashrc * Update way to set environment variable PATH in github action * Change devcontainer base image back to ubuntu:22.04 to match the environment from the test runner * Add option to choose between NSYS and NCU profilers * Add tests for choosing the profiler * Add isort config to help it find local modules so they are not considered 3rd party libraries * Replace experimental-string-processing black formatter config with enable-unstable-feature as it was removed in version 24.1.0 * Search for profiling tools executable paths when they are required * Install dev dependencies in editable mode * Add documentation for using Nsight Systems instead of the default Nsight Compute profiling tool * Fix cuda typo * Mention Nsight Systems in README.md
This commit is contained in:
committed by
GitHub
parent
781ff5b76b
commit
0bddf6a6e6
+56
-10
@@ -9,13 +9,20 @@ import shutil
|
||||
import subprocess
|
||||
import tempfile
|
||||
import uuid
|
||||
from typing import List, Optional
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
# pylint: disable=import-error
|
||||
from IPython.core.interactiveshell import InteractiveShell
|
||||
from IPython.core.magic import Magics, cell_magic, line_magic, magics_class
|
||||
|
||||
from . import parsers
|
||||
from .parsers import (
|
||||
Profiler,
|
||||
get_parser_cuda,
|
||||
get_parser_cuda_group_delete,
|
||||
get_parser_cuda_group_run,
|
||||
get_parser_cuda_group_save,
|
||||
)
|
||||
from .path_utils import CUDA_SEARCH_PATHS, find_executable
|
||||
|
||||
DEFAULT_EXEC_FNAME = "cuda_exec.out"
|
||||
SHARED_GROUP_NAME = "shared"
|
||||
@@ -37,14 +44,19 @@ class NVCCPlugin(Magics):
|
||||
super().__init__(shell)
|
||||
self.shell: InteractiveShell # type hint not provided by parent class
|
||||
|
||||
self.parser_cuda = parsers.get_parser_cuda()
|
||||
self.parser_cuda_group_save = parsers.get_parser_cuda_group_save()
|
||||
self.parser_cuda_group_delete = parsers.get_parser_cuda_group_delete()
|
||||
self.parser_cuda_group_run = parsers.get_parser_cuda_group_run()
|
||||
self.parser_cuda = get_parser_cuda()
|
||||
self.parser_cuda_group_save = get_parser_cuda_group_save()
|
||||
self.parser_cuda_group_delete = get_parser_cuda_group_delete()
|
||||
self.parser_cuda_group_run = get_parser_cuda_group_run()
|
||||
|
||||
self.workdir = tempfile.mkdtemp()
|
||||
print(f'Source files will be saved in "{self.workdir}".')
|
||||
|
||||
self.profiler_paths: Dict[Profiler, Optional[str]] = {
|
||||
Profiler.NCU: None,
|
||||
Profiler.NSYS: None,
|
||||
}
|
||||
|
||||
def _save_source(
|
||||
self, source_name: str, source_code: str, group_name: str
|
||||
) -> None:
|
||||
@@ -135,11 +147,42 @@ class NVCCPlugin(Magics):
|
||||
|
||||
return executable_fpath
|
||||
|
||||
def _run(
|
||||
def _get_profiler_path(self, profiler: Profiler) -> str:
|
||||
"""
|
||||
Get the path of the executable of a given profiling tool. Searches
|
||||
the directories of the PATH environment variable and some extra
|
||||
directories where CUDA is usually installed.
|
||||
|
||||
Args:
|
||||
profiler: The profiler whose executable should be found.
|
||||
|
||||
Raises:
|
||||
RuntimeError: If the profiler executable could not be found.
|
||||
|
||||
Returns:
|
||||
The file path of the executable.
|
||||
"""
|
||||
profiler_path = self.profiler_paths[profiler]
|
||||
if profiler_path is not None:
|
||||
return profiler_path
|
||||
|
||||
profiler_path = find_executable(profiler.value, CUDA_SEARCH_PATHS)
|
||||
if profiler_path is None:
|
||||
raise RuntimeError(
|
||||
f'Could not find the "{profiler.value}" profiling tool.'
|
||||
" Consider searching for where it is installed and adding its"
|
||||
" directory to the PATH environment variable."
|
||||
)
|
||||
|
||||
self.profiler_paths[profiler] = profiler_path
|
||||
return profiler_path
|
||||
|
||||
def _run( # pylint: disable=too-many-arguments
|
||||
self,
|
||||
exec_fpath: str,
|
||||
timeit: bool = False,
|
||||
profile: bool = False,
|
||||
profiler: Profiler = Profiler.NCU,
|
||||
profiler_args: str = "",
|
||||
) -> str:
|
||||
"""
|
||||
@@ -150,8 +193,9 @@ class NVCCPlugin(Magics):
|
||||
timeit: If True, returns the result of the "timeit" magic instead
|
||||
of the standard output of the CUDA process. Defaults to False.
|
||||
profile: If True, the executable is profiled with NVIDIA Nsight
|
||||
Compute profiling tool and its output is added to stdout.
|
||||
Defaults to False.
|
||||
Compute or NVIDIA Nsight Systems and the profiling output is
|
||||
added to stdout. Defaults to False.
|
||||
profiler: The profiling tool to use.
|
||||
profiler_args: The profiler arguments used to customize the
|
||||
information gathered by it and its overall behaviour. Defaults
|
||||
to an empty string.
|
||||
@@ -173,7 +217,8 @@ class NVCCPlugin(Magics):
|
||||
else:
|
||||
run_args = []
|
||||
if profile:
|
||||
run_args.extend(["ncu"] + profiler_args.split())
|
||||
profiler_path = self._get_profiler_path(profiler)
|
||||
run_args.extend([profiler_path] + profiler_args.split())
|
||||
run_args.append(exec_fpath)
|
||||
output = subprocess.check_output(
|
||||
run_args, stderr=subprocess.STDOUT
|
||||
@@ -194,6 +239,7 @@ class NVCCPlugin(Magics):
|
||||
exec_fpath=exec_fpath,
|
||||
timeit=args.timeit,
|
||||
profile=args.profile,
|
||||
profiler=args.profiler(),
|
||||
profiler_args=args.profiler_args(),
|
||||
)
|
||||
except subprocess.CalledProcessError as e:
|
||||
|
||||
Reference in New Issue
Block a user