NVTX.h 2.83 KB
Newer Older
Martin Bauer's avatar
Martin Bauer committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
//======================================================================================================================
//
//  This file is part of waLBerla. waLBerla is free software: you can
//  redistribute it and/or modify it under the terms of the GNU General Public
//  License as published by the Free Software Foundation, either version 3 of
//  the License, or (at your option) any later version.
//
//  waLBerla is distributed in the hope that it will be useful, but WITHOUT
//  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
//  for more details.
//
//  You should have received a copy of the GNU General Public License along
//  with waLBerla (see COPYING.txt). If not, see <http://www.gnu.org/licenses/>.
//
//! \file NVTX.h
//! \ingroup cuda
//! \author Martin Bauer <martin.bauer@fau.de>
//
//======================================================================================================================

#include "core/DataTypes.h"

#include <string>

#ifdef WALBERLA_CUDA_NVTX_AVAILABLE
#include <nvToolsExt.h>
#include <nvToolsExtCuda.h>
#include <nvToolsExtCudaRt.h>

namespace walberla{
namespace cuda {

inline void nvtxMarker(const std::string& name, const uint32_t color=0xaaaaaa)
{
    nvtxEventAttributes_t eventAttrib;
    memset(&eventAttrib, 0, NVTX_EVENT_ATTRIB_STRUCT_SIZE);
    eventAttrib.version = NVTX_VERSION;
    eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
    eventAttrib.colorType = NVTX_COLOR_ARGB;
    eventAttrib.color = 0xFF000000 | color;
    eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII;
    eventAttrib.message.ascii = name.c_str();
    nvtxMarkEx(&eventAttrib);
}

inline void nameStream(const cudaStream_t & stream, const std::string & name)
{
    nvtxNameCudaStreamA(stream, name.c_str());
}

class NvtxRange
{
public:
    NvtxRange(const std::string & name, const uint32_t color=0xaaaaaa)
    {
        memset(&eventAttrib, 0, NVTX_EVENT_ATTRIB_STRUCT_SIZE);
        eventAttrib.version = NVTX_VERSION;
        eventAttrib.size = NVTX_EVENT_ATTRIB_STRUCT_SIZE;
        eventAttrib.colorType = NVTX_COLOR_ARGB;
        eventAttrib.color = 0xFF000000 | color;
        eventAttrib.messageType = NVTX_MESSAGE_TYPE_ASCII;
        eventAttrib.message.ascii = name.c_str();
        nvtxRangePushEx(&eventAttrib);
    }
    ~NvtxRange()
    {
        nvtxRangePop();
    }
private:
    nvtxEventAttributes_t eventAttrib;
};


} // namespace cuda
} // namespace walberla




#else
namespace walberla{
namespace cuda {

inline void nameStream(const cudaStream_t & stream, const std::string & name) {}
inline void nvtxMarker(const std::string& name, const uint32_t color=0xaaaaaa) {}
class NvtxRange
{
public:
    NvtxRange(const std::string & name, const uint32_t color=0xaaaaaa) {}}
};

} // namespace cuda
} // namespace walberla


#endif