Skip to content

Commit 06ca5e9

Browse files
simple verbose mode impl (#768)
* simple verbose mode impl
1 parent a26bbee commit 06ca5e9

File tree

6 files changed

+136
-4
lines changed

6 files changed

+136
-4
lines changed

dpnp/backend/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,9 @@ set(DPNP_SRC
186186
kernels/dpnp_krnl_statistics.cpp
187187
src/dpnp_iface_fptr.cpp
188188
src/memory_sycl.cpp
189-
src/queue_sycl.cpp)
189+
src/queue_sycl.cpp
190+
src/verbose.cpp
191+
)
190192

191193
if(DPNP_STATIC_LIB_ENABLE)
192194
add_library(dpnp_backend_c STATIC ${DPNP_SRC})

dpnp/backend/kernels/dpnp_krnl_linalg.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,9 +415,15 @@ void dpnp_qr_c(void* array1_in, void* result1, void* result2, void* result3, siz
415415
_ComputeDT* geqrf_scratchpad =
416416
reinterpret_cast<_ComputeDT*>(dpnp_memory_alloc_c(geqrf_scratchpad_size * sizeof(_ComputeDT)));
417417

418-
event = mkl_lapack::geqrf(DPNP_QUEUE, size_m, size_n, in_a, lda, tau, geqrf_scratchpad, geqrf_scratchpad_size);
418+
cl::sycl::vector_class<cl::sycl::event> depends(1);
419+
set_barrier_event(DPNP_QUEUE, depends);
420+
421+
event = mkl_lapack::geqrf(DPNP_QUEUE, size_m, size_n, in_a, lda, tau, geqrf_scratchpad, geqrf_scratchpad_size, depends);
419422

420423
event.wait();
424+
425+
verbose_print("oneapi::mkl::lapack::geqrf", depends.front(), event);
426+
421427
dpnp_memory_free_c(geqrf_scratchpad);
422428

423429
// R
@@ -444,10 +450,16 @@ void dpnp_qr_c(void* array1_in, void* result1, void* result2, void* result3, siz
444450
_ComputeDT* orgqr_scratchpad =
445451
reinterpret_cast<_ComputeDT*>(dpnp_memory_alloc_c(orgqr_scratchpad_size * sizeof(_ComputeDT)));
446452

453+
depends.clear();
454+
set_barrier_event(DPNP_QUEUE, depends);
455+
447456
event =
448-
mkl_lapack::orgqr(DPNP_QUEUE, size_m, size_m, nrefl, in_a, lda, tau, orgqr_scratchpad, orgqr_scratchpad_size);
457+
mkl_lapack::orgqr(DPNP_QUEUE, size_m, size_m, nrefl, in_a, lda, tau, orgqr_scratchpad, orgqr_scratchpad_size, depends);
449458

450459
event.wait();
460+
461+
verbose_print("oneapi::mkl::lapack::orgqr", depends.front(), event);
462+
451463
dpnp_memory_free_c(orgqr_scratchpad);
452464

453465
for (size_t i = 0; i < size_m; ++i)

dpnp/backend/src/queue_sycl.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,15 @@ void backend_sycl::backend_sycl_queue_init(QueueOptions selector)
170170
dev = get_default_sycl_device();
171171
}
172172

173-
queue = new cl::sycl::queue(dev, exception_handler);
173+
if (is_verbose_mode())
174+
{
175+
cl::sycl::property_list properties{sycl::property::queue::enable_profiling()};
176+
queue = new cl::sycl::queue(dev, exception_handler, properties);
177+
}
178+
else
179+
{
180+
queue = new cl::sycl::queue(dev, exception_handler);
181+
}
174182

175183
std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();
176184
std::chrono::duration<double> time_queue_init = std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1);

dpnp/backend/src/queue_sycl.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646

4747
#include "dpnp_pstl.hpp" // this header must be included after <mkl.hpp>
4848

49+
#include "verbose.hpp"
50+
4951
namespace mkl_rng = oneapi::mkl::rng;
5052

5153
#define DPNP_QUEUE backend_sycl::get_queue()

dpnp/backend/src/verbose.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
//*****************************************************************************
2+
// Copyright (c) 2016-2020, Intel Corporation
3+
// All rights reserved.
4+
//
5+
// Redistribution and use in source and binary forms, with or without
6+
// modification, are permitted provided that the following conditions are met:
7+
// - Redistributions of source code must retain the above copyright notice,
8+
// this list of conditions and the following disclaimer.
9+
// - Redistributions in binary form must reproduce the above copyright notice,
10+
// this list of conditions and the following disclaimer in the documentation
11+
// and/or other materials provided with the distribution.
12+
//
13+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14+
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15+
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16+
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
17+
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18+
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19+
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20+
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21+
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22+
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23+
// THE POSSIBILITY OF SUCH DAMAGE.
24+
//*****************************************************************************
25+
26+
#include "verbose.hpp"
27+
#include <iostream>
28+
29+
bool _is_verbose_mode = false;
30+
bool _is_verbose_mode_init = false;
31+
32+
bool is_verbose_mode()
33+
{
34+
if(!_is_verbose_mode_init)
35+
{
36+
_is_verbose_mode = false;
37+
const char* env_var = std::getenv("DPNP_VERBOSE");
38+
if (env_var and env_var == std::string("1"))
39+
{
40+
_is_verbose_mode = true;
41+
}
42+
_is_verbose_mode_init = true;
43+
}
44+
return _is_verbose_mode;
45+
}
46+
47+
class barrierKernelClass;
48+
49+
void set_barrier_event(cl::sycl::queue queue, sycl::vector_class<sycl::event> & depends)
50+
{
51+
if (is_verbose_mode())
52+
{
53+
cl::sycl::event barrier_event = queue.single_task<barrierKernelClass>(depends, [=] {});
54+
depends.clear();
55+
depends.push_back(barrier_event);
56+
}
57+
}
58+
59+
void verbose_print(std::string header, cl::sycl::event first_event, cl::sycl::event last_event)
60+
{
61+
if (is_verbose_mode())
62+
{
63+
auto first_event_end = first_event.get_profiling_info<sycl::info::event_profiling::command_end>();
64+
auto last_event_end = last_event.get_profiling_info<sycl::info::event_profiling::command_end>();
65+
std::cout << "DPNP_VERBOSE "
66+
<< header
67+
<< " Time: "
68+
<< (last_event_end - first_event_end)/1.0e9
69+
<< " s"
70+
<< std::endl;
71+
}
72+
}

dpnp/backend/src/verbose.hpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
//*****************************************************************************
2+
// Copyright (c) 2016-2020, Intel Corporation
3+
// All rights reserved.
4+
//
5+
// Redistribution and use in source and binary forms, with or without
6+
// modification, are permitted provided that the following conditions are met:
7+
// - Redistributions of source code must retain the above copyright notice,
8+
// this list of conditions and the following disclaimer.
9+
// - Redistributions in binary form must reproduce the above copyright notice,
10+
// this list of conditions and the following disclaimer in the documentation
11+
// and/or other materials provided with the distribution.
12+
//
13+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14+
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15+
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16+
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
17+
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18+
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19+
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20+
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21+
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22+
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23+
// THE POSSIBILITY OF SUCH DAMAGE.
24+
//*****************************************************************************
25+
26+
#pragma once
27+
#ifndef VERBOSE_H // Cython compatibility
28+
#define VERBOSE_H
29+
30+
#include <CL/sycl.hpp>
31+
32+
bool is_verbose_mode();
33+
void set_barrier_event(cl::sycl::queue queue, sycl::vector_class<sycl::event> & depends);
34+
void verbose_print(std::string header, cl::sycl::event first_event, cl::sycl::event last_event);
35+
36+
#endif // VERBOSE_H

0 commit comments

Comments
 (0)