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