Merge branch 'develop' of https://github.com/PaddlePaddle/Paddle into my_unpool_max_2d
commit
5b449b6021
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,53 @@
|
|||||||
|
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License. */
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
#include <cuda_profiler_api.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
namespace paddle {
|
||||||
|
namespace platform {
|
||||||
|
|
||||||
|
void CudaProfilerInit(std::string output_file, std::string output_mode,
|
||||||
|
std::vector<std::string> config_flags) {
|
||||||
|
std::array<char, 128> buf;
|
||||||
|
std::string tmpl = "/tmp/cuda_profile_config.XXXXXX";
|
||||||
|
PADDLE_ENFORCE_LT(tmpl.size(), buf.size());
|
||||||
|
memcpy(buf.data(), tmpl.data(), tmpl.size());
|
||||||
|
auto result = mktemp(buf.data());
|
||||||
|
PADDLE_ENFORCE(strlen(result) != 0);
|
||||||
|
std::string config_file = result;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::ofstream ofs(config_file, std::ios::out | std::ios::trunc);
|
||||||
|
PADDLE_ENFORCE(ofs.is_open(), "ofstream: ", ofs.rdstate());
|
||||||
|
for (const auto& line : config_flags) {
|
||||||
|
ofs << line << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PADDLE_ENFORCE(output_mode == "kvp" || output_mode == "csv");
|
||||||
|
cudaOutputMode_t mode = output_mode == "csv" ? cudaCSV : cudaKeyValuePair;
|
||||||
|
PADDLE_ENFORCE(
|
||||||
|
cudaProfilerInitialize(config_file.c_str(), output_file.c_str(), mode));
|
||||||
|
}
|
||||||
|
|
||||||
|
void CudaProfilerStart() { PADDLE_ENFORCE(cudaProfilerStart()); }
|
||||||
|
|
||||||
|
void CudaProfilerStop() { PADDLE_ENFORCE(cudaProfilerStop()); }
|
||||||
|
|
||||||
|
} // namespace platform
|
||||||
|
} // namespace paddle
|
@ -0,0 +1,46 @@
|
|||||||
|
import paddle.v2.fluid.core as core
|
||||||
|
from contextlib import contextmanager
|
||||||
|
|
||||||
|
__all__ = ['CudaProfiler']
|
||||||
|
|
||||||
|
NVPROF_CONFIG = [
|
||||||
|
"gpustarttimestamp",
|
||||||
|
"gpuendtimestamp",
|
||||||
|
"gridsize3d",
|
||||||
|
"threadblocksize",
|
||||||
|
"streamid",
|
||||||
|
"enableonstart 0",
|
||||||
|
"conckerneltrace",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def cuda_profiler(output_file, output_mode=None, config=None):
|
||||||
|
"""The CUDA profiler.
|
||||||
|
This fuctions is used to profile CUDA program by CUDA runtime application
|
||||||
|
programming interface. The profiling result will be written into
|
||||||
|
`output_file` with Key-Value pair format or Comma separated values format.
|
||||||
|
The user can set the output mode by `output_mode` argument and set the
|
||||||
|
counters/options for profiling by `config` argument. The default config
|
||||||
|
caontains 'gpustarttimestamp', 'gpustarttimestamp', 'gridsize3d',
|
||||||
|
'threadblocksize', 'streamid', 'enableonstart 0', 'conckerneltrace'.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
output_file (string) : The output file name, the result will be
|
||||||
|
written into this file.
|
||||||
|
output_mode (string) : The output mode has Key-Value pair format and
|
||||||
|
Comma separated values format. It should be 'kv' or 'csv'.
|
||||||
|
config (string) : The profiler options and counters can refer to
|
||||||
|
"Compute Command Line Profiler User Guide".
|
||||||
|
"""
|
||||||
|
if output_mode is None:
|
||||||
|
output_mode = 'csv'
|
||||||
|
if output_mode not in ['kv', 'csv']:
|
||||||
|
raise ValueError("The output mode must be 'key-value' or 'csv'.")
|
||||||
|
config = NVPROF_CONFIG if config is None else config
|
||||||
|
core.nvprof_init(output_file, output_mode, config)
|
||||||
|
# Enables profiler collection by the active CUDA profiling tool.
|
||||||
|
core.nvprof_start()
|
||||||
|
yield
|
||||||
|
# Disables profiler collection.
|
||||||
|
core.nvprof_stop()
|
@ -0,0 +1,28 @@
|
|||||||
|
import unittest
|
||||||
|
import numpy as np
|
||||||
|
import paddle.v2.fluid as fluid
|
||||||
|
import paddle.v2.fluid.profiler as profiler
|
||||||
|
import paddle.v2.fluid.layers as layers
|
||||||
|
|
||||||
|
|
||||||
|
class TestProfiler(unittest.TestCase):
|
||||||
|
def test_nvprof(self):
|
||||||
|
if not fluid.core.is_compile_gpu():
|
||||||
|
return
|
||||||
|
epoc = 8
|
||||||
|
dshape = [4, 3, 28, 28]
|
||||||
|
data = layers.data(name='data', shape=[3, 28, 28], dtype='float32')
|
||||||
|
conv = layers.conv2d(data, 20, 3, stride=[1, 1], padding=[1, 1])
|
||||||
|
|
||||||
|
place = fluid.GPUPlace(0)
|
||||||
|
exe = fluid.Executor(place)
|
||||||
|
exe.run(fluid.default_startup_program())
|
||||||
|
|
||||||
|
with profiler.cuda_profiler("cuda_profiler.txt", 'csv') as nvprof:
|
||||||
|
for i in range(epoc):
|
||||||
|
input = np.random.random(dshape).astype("float32")
|
||||||
|
exe.run(fluid.default_main_program(), feed={'data': input})
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
Loading…
Reference in new issue