Skip to content

Commit 77e0236

Browse files
committed
CUDA impl 2
1 parent 874b659 commit 77e0236

19 files changed

Lines changed: 218 additions & 95 deletions

File tree

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ string(
1818
add_compile_options("${_opts}")
1919

2020
option(USE_RUNTIME_CHECKS "Check arguments and emit warnings" OFF)
21-
option(TRACK_STATISTICS "Tracks statistics such as register reads and energy use" ON)
21+
option(TRACK_STATISTICS "Tracks statistics such as register reads and energy use" OFF)
2222
option(USE_CUDA "Uses CUDA for GPU processing" ON)
2323
if (USE_RUNTIME_CHECKS)
2424
message(STATUS "With runtime checks")
@@ -55,7 +55,7 @@ ENDIF ()
5555
set(CONAN_SYSTEM_INCLUDES ON)
5656
conan_basic_setup()
5757

58-
add_executable(${SIM_LIB} main.cpp src/simulator/registers/analogue_register.cpp include/simulator/registers/analogue_register.h src/simulator/registers/digital_register.cpp include/simulator/registers/digital_register.h src/simulator/buses/analogue_bus.cpp include/simulator/buses/analogue_bus.h src/simulator/buses/digital_bus.cpp include/simulator/buses/digital_bus.h src/simulator/base/pixel.cpp include/simulator/base/pixel.h src/simulator/base/architecture.cpp include/simulator/base/architecture.h src/simulator/pe/processing_element.cpp include/simulator/pe/processing_element.h src/simulator/units/comparator.cpp include/simulator/units/comparator.h src/simulator/units/squarer.cpp include/simulator/units/squarer.h src/simulator/registers/register.cpp include/simulator/registers/register.h src/simulator/base/component.cpp include/simulator/base/component.h src/simulator/memory/dram/dram3t_cell.cpp include/simulator/memory/dram3t_cell.h src/simulator/memory/sram/sram6t_cell.cpp include/simulator/memory/sram6t_cell.h src/simulator/memory/memory.cpp include/simulator/memory/memory.h src/simulator/memory/si/si_cell.cpp include/simulator/memory/si_cell.h src/simulator/util/utility.cpp include/simulator/util/utility.h src/simulator/metrics/cycle_counter.cpp include/simulator/metrics/cycle_counter.h src/simulator/metrics/json_writer.cpp include/simulator/metrics/json_writer.h include/simulator/ui/async_file_streamer.h include/simulator/ui/async_file_reader.h src/simulator/ui/ui.cpp include/simulator/ui/ui.h src/simulator/ui/file_watcher.cpp include/simulator/ui/file_watcher.h include/simulator/ui/base64_encoder.h src/simulator/ui/src/base64_encoder.cpp include/simulator/input/input_source.h src/simulator/input/live_input.cpp include/simulator/input/live_input.h src/simulator/input/image_input.cpp include/simulator/input/image_input.h src/simulator/input/video_input.cpp include/simulator/input/video_input.h include/simulator/base/plane_params.h src/simulator/base/plane_params.cpp include/simulator/adders/cla.h src/simulator/adders/cla.cpp include/simulator/base/config.h src/simulator/base/config.cpp include/simulator/metrics/stats_outputter.h src/simulator/memory/dram/dram_array.cpp include/simulator/memory/dram_array.h include/simulator/external/parser.h src/simulator/external/parser.cpp scamp5/scamp5.h scamp5/scamp5.cpp scamp5/analognet2/conv_instructions.h scamp5/analognet2/fc_weights.h scamp5/analognet2/analog_main.h scamp5/analognet2/analog_main.cpp scamp5_extended/scamp5_e.cpp scamp5_extended/scamp5_e.h scamp5_multiplexed/scamp5m.cpp scamp5_multiplexed/scamp5m.h include/simulator/alu/alu.h src/simulator/alu/alu.cpp include/simulator/adc/adc.h src/simulator/adc/adc.cpp include/simulator/metrics/packer.h src/simulator/metrics/packer.cpp include/simulator/metrics/pack_node.h src/simulator/metrics/pack_node.cpp scamp5_multiplexed/scamp5rmalt.cpp scamp5_multiplexed/scamp5rmalt.h scamp5_multiplexed/vj_classifier.cpp scamp5_multiplexed/vj_classifier.h scamp5_multiplexed/image.h)
58+
add_executable(${SIM_LIB} main.cpp src/simulator/registers/analogue_register.cpp include/simulator/registers/analogue_register.h src/simulator/registers/digital_register.cpp include/simulator/registers/digital_register.h src/simulator/buses/analogue_bus.cpp include/simulator/buses/analogue_bus.h src/simulator/buses/digital_bus.cpp include/simulator/buses/digital_bus.h src/simulator/base/pixel.cpp include/simulator/base/pixel.h src/simulator/base/architecture.cpp include/simulator/base/architecture.h src/simulator/pe/processing_element.cpp include/simulator/pe/processing_element.h src/simulator/units/comparator.cpp include/simulator/units/comparator.h src/simulator/units/squarer.cpp include/simulator/units/squarer.h src/simulator/registers/register.cpp include/simulator/registers/register.h src/simulator/base/component.cpp include/simulator/base/component.h src/simulator/memory/dram/dram3t_cell.cpp include/simulator/memory/dram3t_cell.h src/simulator/memory/sram/sram6t_cell.cpp include/simulator/memory/sram6t_cell.h src/simulator/memory/memory.cpp include/simulator/memory/memory.h src/simulator/memory/si/si_cell.cpp include/simulator/memory/si_cell.h src/simulator/util/utility.cpp include/simulator/util/utility.h src/simulator/metrics/cycle_counter.cpp include/simulator/metrics/cycle_counter.h src/simulator/metrics/json_writer.cpp include/simulator/metrics/json_writer.h include/simulator/ui/async_file_streamer.h include/simulator/ui/async_file_reader.h src/simulator/ui/ui.cpp include/simulator/ui/ui.h src/simulator/ui/file_watcher.cpp include/simulator/ui/file_watcher.h include/simulator/ui/base64_encoder.h src/simulator/ui/src/base64_encoder.cpp include/simulator/input/input_source.h src/simulator/input/live_input.cpp include/simulator/input/live_input.h src/simulator/input/image_input.cpp include/simulator/input/image_input.h src/simulator/input/video_input.cpp include/simulator/input/video_input.h include/simulator/base/plane_params.h src/simulator/base/plane_params.cpp include/simulator/adders/cla.h src/simulator/adders/cla.cpp include/simulator/base/config.h src/simulator/base/config.cpp include/simulator/metrics/stats_outputter.h src/simulator/memory/dram/dram_array.cpp include/simulator/memory/dram_array.h include/simulator/external/parser.h src/simulator/external/parser.cpp scamp5/scamp5.h scamp5/scamp5.cpp scamp5/analognet2/conv_instructions.h scamp5/analognet2/fc_weights.h scamp5/analognet2/analog_main.h scamp5/analognet2/analog_main.cpp scamp5_extended/scamp5_e.cpp scamp5_extended/scamp5_e.h scamp5_multiplexed/scamp5m.cpp scamp5_multiplexed/scamp5m.h include/simulator/alu/alu.h src/simulator/alu/alu.cpp include/simulator/adc/adc.h src/simulator/adc/adc.cpp include/simulator/metrics/packer.h src/simulator/metrics/packer.cpp include/simulator/metrics/pack_node.h src/simulator/metrics/pack_node.cpp scamp5_multiplexed/scamp5rmalt.cpp scamp5_multiplexed/scamp5rmalt.h scamp5_multiplexed/vj_classifier.cpp scamp5_multiplexed/vj_classifier.h scamp5_multiplexed/image.h include/simulator/base/opencv_wrappers.h ./src/simulator/base/opencv_wrappers.cpp)
5959

6060
if (WIN32)
6161
string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE)

examples/scamp5/config.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"architecture": "SCAMP5",
33
"frames": 10,
4-
"use_opencl": true,
4+
"use_opencl": false,
55
"frame_time": true,
66
"with_stats": true,
77
"ui_enabled": true,

include/simulator/base/component.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include <nlohmann/json.hpp>
99
#include <opencv2/core.hpp>
10+
#include <opencv2/core/cuda.hpp>
1011
#include <rttr/registration>
1112
#include <memory>
1213

@@ -28,9 +29,14 @@ class Component : public StatsOutputter {
2829
int row_stride_ = 1;
2930
int col_stride_ = 1;
3031
std::shared_ptr<Config> config_;
32+
#ifdef USE_CUDA
33+
cv::cuda::GpuMat internal_mask; // Used to keep track of components in array when stride is not 1, i.e. spaces between components
34+
#else
3135
cv::UMat internal_mask; // Used to keep track of components in array when stride is not 1, i.e. spaces between components
36+
#endif
3237

3338
public:
39+
void init();
3440
void calc_internal_mask();
3541

3642
/*Setters*/
@@ -50,12 +56,17 @@ class Component : public StatsOutputter {
5056
double dynamic_power_; // in Watts
5157
double width_; // in Micrometres
5258
double height_; // in Mircometres
53-
cv::UMat array_transistor_count_;
5459
cv::UMat array_static_energy_;
55-
cv::UMat array_dynamic_energy_;
60+
cv::UMat array_dynamic_energy_; // No GPUMat for these two as float ops are not always supported on GPUs but int ops usually are
61+
#ifdef USE_CUDA
62+
cv::cuda::GpuMat array_transistor_count_;
63+
#else
64+
cv::UMat array_transistor_count_;
65+
#endif
5666
public:
5767
/* Update component with how much time has passed for operation. Used for updating static power. */
5868
virtual void update_static(double time) = 0;
69+
5970
/* Returns the total amount of static energy use */
6071
virtual cv::Mat get_static_energy_array();
6172
/* Returns the total amount of dynamic energy use */
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//
2+
// Created by jm1417 on 29/05/2021.
3+
//
4+
5+
#ifndef SIMULATOR_OPENCV_WRAPPERS_H
6+
#define SIMULATOR_OPENCV_WRAPPERS_H
7+
8+
#include <opencv2/core.hpp>
9+
#include <opencv2/core/cuda.hpp>
10+
11+
/*Wrappers around common OpenCV functionality which makes GPU switching easy */
12+
13+
namespace ocv_wrappers::arith {
14+
void add(cv::OutputArray dst, cv::InputArray src1, cv::InputArray src2);
15+
void add(cv::OutputArray dst, cv::InputArray src1, cv::InputArray src2, cv::InputArray mask);
16+
17+
}
18+
19+
20+
21+
#endif //SIMULATOR_OPENCV_WRAPPERS_H

include/simulator/memory/memory.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ class Memory : public Component {
2323
double dynamic_read_power_; // in Watts for a read
2424
double dynamic_write_power_; // in Watts for a read
2525
double time_; // time in seconds for a read/write
26+
#ifdef USE_CUDA
27+
cv::cuda::GpuMat scratch;
28+
#else
2629
cv::UMat scratch;
30+
#endif
2731

2832
public:
2933
Memory() = default;

include/simulator/registers/register.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class Register : public Component {
5454
double get_width() override;
5555
double get_height() override;
5656
int get_transistor_count() override;
57+
5758
#endif
5859

5960
void set_memory(MemoryType memory_type);

src/simulator/adc/adc.cpp

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,20 +6,10 @@
66
#include <rttr/registration>
77
#include "simulator/util/utility.h"
88

9-
109
void ADC::init() {
1110
#ifdef TRACK_STATISTICS
12-
transistor_count_ = calc_transistor_count();
13-
static_power_ = calc_static();
14-
dynamic_power_ = calc_dynamic();
15-
width_ = calc_width();
16-
height_ = calc_height();
1711
time_ = (this->cycle_count_ * (1.0 / config_->get_clock_rate()));
18-
internal_mask = cv::UMat(rows_, cols_, CV_8U, cv::Scalar(0));
19-
array_transistor_count_ = cv::UMat(rows_, cols_, CV_32S, cv::Scalar(0));
20-
array_static_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
21-
array_dynamic_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
22-
this->calc_internal_mask();
12+
Component::init();
2313
#endif
2414
}
2515

src/simulator/adders/cla.cpp

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,21 +12,12 @@
1212
/*Bits refers to the number of bits in the two inputs and the output. So an 8-bit adders takes in two 8-bit values and outputs an 8-bit value*/
1313

1414
void CarryLookAheadAdder::init() {
15-
internal_mask = cv::UMat(rows_, cols_, CV_8U, cv::Scalar(0));
1615
#ifdef TRACK_STATISTICS
1716
cycle_count_ = 1;
18-
transistor_count_ = calc_transistor_count();
19-
static_power_ = calc_static();
20-
dynamic_power_ = calc_dynamic();
21-
width_ = calc_width();
22-
height_ = calc_height();
2317
time_ = this->cycle_count_ * (1.0 / config_->get_clock_rate());
24-
array_transistor_count_ = cv::UMat(rows_, cols_, CV_32S, cv::Scalar(0));
25-
array_static_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
26-
array_dynamic_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
2718
scratch = cv::UMat(rows_, cols_, CV_8U, cv::Scalar(0));
19+
Component::init();
2820
#endif
29-
this->calc_internal_mask();
3021
}
3122

3223
#ifdef TRACK_STATISTICS

src/simulator/alu/alu.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,10 @@
77
#include <rttr/registration>
88

99
void ALU::init() {
10-
internal_mask = cv::UMat(rows_, cols_, CV_8U, cv::Scalar(0));
1110
#ifdef TRACK_STATISTICS
12-
transistor_count_ = calc_transistor_count();
13-
static_power_ = calc_static();
14-
dynamic_power_ = calc_dynamic();
1511
time_ = (this->cycle_count_ * (1.0 / config_->get_clock_rate()));
16-
array_transistor_count_ = cv::UMat(rows_, cols_, CV_32S, cv::Scalar(0));
17-
array_static_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
18-
array_dynamic_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
12+
Component::init();
1913
#endif
20-
this->calc_internal_mask();
2114
}
2215

2316
void ALU::set_bits(int bits) {

src/simulator/base/component.cpp

Lines changed: 53 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,43 @@
55
#include <cmath>
66
#include <utility>
77

8+
void Component::init() {
9+
#ifdef TRACK_STATISTICS
10+
transistor_count_ = calc_transistor_count();
11+
static_power_ = calc_static();
12+
dynamic_power_ = calc_dynamic();
13+
width_ = calc_width();
14+
height_ = calc_height();
15+
#ifdef USE_CUDA
16+
internal_mask = cv::cuda::GpuMat(rows_, cols_, CV_8U, cv::Scalar(0));
17+
array_transistor_count_ = cv::cuda::GpuMat(rows_, cols_, CV_32S, cv::Scalar(0));
18+
array_static_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
19+
array_dynamic_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
20+
#else
21+
internal_mask = cv::UMat(rows_, cols_, CV_8U, cv::Scalar(0));
22+
array_transistor_count_ = cv::UMat(rows_, cols_, CV_32S, cv::Scalar(0));
23+
array_static_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
24+
array_dynamic_energy_ = cv::UMat(rows_, cols_, CV_64F, cv::Scalar(0));
25+
#endif
26+
this->calc_internal_mask();
27+
#endif
28+
}
29+
830
void Component::calc_internal_mask() {
9-
cv::Mat im = this->internal_mask.getMat(cv::ACCESS_WRITE);
31+
cv::Mat im;
32+
#ifdef USE_CUDA
33+
this->internal_mask.download(im);
34+
#else
35+
im = this->internal_mask.getMat(cv::ACCESS_WRITE);
36+
#endif
1037
for (int row = 0; row < rows_; row += row_stride_) {
1138
for (int col = 0; col < cols_; col += col_stride_) {
1239
im.at<uint8_t>(row, col) = 1;
1340
}
1441
}
42+
#ifdef USE_CUDA
43+
this->internal_mask.upload(im);
44+
#endif
1545
}
1646

1747
void Component::set_process_node(int process_node) {
@@ -58,7 +88,13 @@ cv::Mat Component::get_transistor_count_array() {
5888
#ifdef TRACK_STATISTICS
5989
array_transistor_count_.setTo(transistor_count_, this->internal_mask);
6090
#endif
91+
#ifdef USE_CUDA
92+
cv::Mat m;
93+
this->array_transistor_count_.download(m);
94+
return m;
95+
#else
6196
return this->array_transistor_count_.getMat(cv::ACCESS_READ);
97+
#endif
6298
}
6399

64100
int Component::get_transistor_count() {
@@ -73,6 +109,22 @@ double Component::get_height() {
73109
return this->height_;
74110
}
75111

112+
double Component::scale_speed(double base) {
113+
double sf = 7.6 - 0.961 * log(5.531 * config_->get_clock_rate() - 104.456);
114+
return base * sf;
115+
}
116+
117+
double Component::scale_width(double base) {
118+
// Scale with process node
119+
double sf = (double) config_->get_process_node() / this->process_node_;
120+
return base * sf;
121+
}
122+
123+
double Component::scale_height(double base) {
124+
double sf = (double) config_->get_process_node() / this->process_node_;
125+
return base * sf;
126+
}
127+
76128
int Component::calc_transistor_count() {
77129
return 0;
78130
}
@@ -93,22 +145,6 @@ double Component::calc_height() {
93145
return 0;
94146
}
95147

96-
double Component::scale_speed(double base) {
97-
double sf = 7.6 - 0.961 * log(5.531 * config_->get_clock_rate() - 104.456);
98-
return base * sf;
99-
}
100-
101-
double Component::scale_width(double base) {
102-
// Scale with process node
103-
double sf = (double) config_->get_process_node() / this->process_node_;
104-
return base * sf;
105-
}
106-
107-
double Component::scale_height(double base) {
108-
double sf = (double) config_->get_process_node() / this->process_node_;
109-
return base * sf;
110-
}
111-
112148
#endif
113149

114150
RTTR_REGISTRATION {

0 commit comments

Comments
 (0)