Skip to content

Commit b8c3509

Browse files
committed
Add improvements to bridge module and demo.
1 parent 67f5656 commit b8c3509

9 files changed

Lines changed: 110 additions & 151 deletions

File tree

bridge/lib/bridge.cpp

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,9 @@ torch::ScalarType get_best_dtype() {
8383
}
8484
}
8585

86-
std::size_t bridge_tensor_elements(bridge_tensor_t &bt) {
87-
std::size_t size = 1;
88-
for (std::size_t i = 0; i < bt.dim; ++i) {
89-
size *= bt.sizes[i];
90-
}
91-
return size;
92-
}
93-
94-
size_t bridge_tensor_size(bridge_tensor_t &bt) {
95-
return sizeof(float32_t) * bridge_tensor_elements(bt);
96-
}
9786

9887
void store_tensor(at::Tensor &input, float32_t* dest) {
99-
float32_t * data = input.data_ptr<float32_t>();
88+
const float32_t * data = input.const_data_ptr<float32_t>();
10089
std::size_t bytes_size = sizeof(float32_t) * input.numel();
10190
// std::memmove(dest,data,bytes_size);
10291
std::memcpy(dest,data,bytes_size);
@@ -125,21 +114,30 @@ extern "C" void free_bridge_tensor(bridge_tensor_t bt) {
125114
if (bt.created_by_c && !bt.was_freed) {
126115
free(bt.sizes);
127116
free(bt.data);
128-
bt.was_freed = true;
117+
return;
118+
} else if (!bt.created_by_c) {
119+
std::cerr << "Warning: Attempting to free a tensor not created by C code." << std::endl;
120+
std::cerr.flush();
121+
} else if (bt.was_freed) {
122+
std::cerr << "Warning: Attempting to free a tensor that has already been freed." << std::endl;
123+
std::cerr.flush();
124+
} else {
125+
std::cerr << "Warning: Attempting to free a tensor with an unknown state." << std::endl;
126+
std::cerr.flush();
129127
}
130128
}
131129

132130

133131
at::Tensor bridge_to_torch(bridge_tensor_t &bt) {
134132
std::vector<int64_t> sizes_vec(bt.sizes, bt.sizes + bt.dim);
135133
auto shape = torch::IntArrayRef(sizes_vec);
136-
return torch::from_blob(bt.data, shape, torch::kFloat);
134+
return torch::from_blob(bt.data, shape, torch::kFloat32);
137135
}
138136

139137
at::Tensor bridge_to_torch(bridge_tensor_t &bt,torch::Device device, bool copy,torch::ScalarType dtype = torch::kFloat32) {
140138
std::vector<int64_t> sizes_vec(bt.sizes, bt.sizes + bt.dim);
141139
auto shape = torch::IntArrayRef(sizes_vec);
142-
auto t = torch::from_blob(bt.data, shape, torch::kFloat);
140+
auto t = torch::from_blob(bt.data, shape, torch::kFloat32);
143141
if (device != torch::kCPU)
144142
copy = true;
145143
if (copy)
@@ -247,7 +245,7 @@ extern "C" bridge_pt_model_t load_model(const uint8_t* model_path) {
247245

248246

249247
extern "C" bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input) {
250-
auto tn_mps = bridge_to_torch(input,best_device,true,best_dtype);
248+
auto tn_mps = bridge_to_torch(input,best_device,false,best_dtype);
251249
// tn_mps = tn_mps.permute({2, 0, 1}).contiguous();
252250
// tn_mps.unsqueeze_(0);//.contiguous();
253251
auto tn = tn_mps.permute({2, 0, 1}).unsqueeze(0).contiguous();
@@ -260,7 +258,7 @@ extern "C" bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_
260258
// auto tn_out = o.squeeze(0).permute({1, 2, 0}).contiguous();
261259
auto tn_out = o.squeeze(0).contiguous().permute({1, 2, 0}).contiguous();
262260

263-
auto tn_out_cpu = tn_out.to(torch::kCPU,torch::kFloat32,false,true);
261+
auto tn_out_cpu = tn_out.to(torch::kCPU,torch::kFloat32,false,false);
264262

265263
return torch_to_bridge(tn_out_cpu);
266264

demos/video/chapel-webcam/main.cpp

Lines changed: 34 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -3,103 +3,48 @@
33

44
#include <opencv2/opencv.hpp>
55
#include <iostream>
6+
#include <cstddef>
7+
#include <tuple>
68

9+
#include <thread>
10+
#include <chrono>
711

812

9-
cv::Mat new_frame(cv::Mat &frame) {
10-
// cv::Mat rgb_uchar_frame;
11-
// cv::cvtColor(frame, rgb_uchar_frame, cv::COLOR_BGR2RGB);
12-
13-
// cv::Mat rgb_float_frame;
14-
// rgb_uchar_frame.convertTo(rgb_float_frame, CV_32FC3, 1.0f/255.0f);
15-
13+
std::tuple<cv::Mat,std::size_t> new_frame(cv::Mat &frame) {
1614

1715
cv::Mat rgb_float_frame;
1816
cv::cvtColor(frame, rgb_float_frame, cv::COLOR_BGR2RGB);
1917
rgb_float_frame.convertTo(rgb_float_frame, CV_32FC3, 1.0f/255.0f);
2018

21-
// cv::MatSize size = rgb_frame.size;
22-
// std::cout << "x " << size[0] << " y " << size[1] << " channels " << rgb_frame.dims << std::endl;
2319
int64_t height = rgb_float_frame.rows;
2420
int64_t width = rgb_float_frame.cols;
2521
int64_t channels = rgb_float_frame.channels();
2622
int64_t pixels = rgb_float_frame.total();
2723
int64_t size = pixels * channels;
2824

29-
// std::cout << "Width: " << width << ", Height: " << height << ", Channels: " << channels << ", Size: " << size << std::endl;
30-
3125
chpl_external_array
3226
rgb_float_frame_data_ptr = chpl_make_external_array_ptr(rgb_float_frame.data,size);
3327

28+
std::size_t chpl_start = cv::getTickCount();
29+
3430
chpl_external_array
3531
rgb_float_output_frame_array = getNewFrame(&rgb_float_frame_data_ptr, height, width, channels);
3632

33+
std::size_t chpl_end = cv::getTickCount();
34+
3735
chpl_free_external_array(rgb_float_frame_data_ptr);
3836

39-
// cv::Mat new_rgb_frame(height, width, CV_8UC3,new_frame_array.elts);
40-
// cv::cvtColor(new_rgb_frame, new_rgb_frame, cv::COLOR_RGB2BGR);
4137

4238
cv::Mat output_frame(height,width,CV_32FC3,rgb_float_output_frame_array.elts); // frame to write to
4339
output_frame.convertTo(output_frame, CV_8UC3, 255.0f);
4440
cv::cvtColor(output_frame, output_frame, cv::COLOR_RGB2BGR);
4541

4642
chpl_free_external_array(rgb_float_output_frame_array);
4743

48-
return output_frame;
49-
50-
// cv::Mat rgb_float_output_frame(height,width,CV_32FC3,rgb_float_output_frame_array.elts); // frame to write to
51-
52-
// cv::Mat rgb_uchar_output_frame;
53-
// rgb_float_output_frame.convertTo(rgb_uchar_output_frame, CV_8UC3, 255.0f);
54-
55-
// cv::Mat bgr_uchar_output_frame;
56-
// cv::cvtColor(rgb_uchar_output_frame, bgr_uchar_output_frame, cv::COLOR_RGB2BGR);
57-
58-
// return bgr_uchar_output_frame;
59-
}
60-
61-
/*
62-
cv::Mat new_frame(cv::Mat &frame) {
63-
cv::Mat rgb_frame;
64-
cv::cvtColor(frame, rgb_frame, cv::COLOR_BGR2RGB);
65-
std::cout << "Frame size: " << rgb_frame.size() << std::endl;
66-
67-
// cv::MatSize size = rgb_frame.size;
68-
// std::cout << "x " << size[0] << " y " << size[1] << " channels " << rgb_frame.dims << std::endl;
69-
int64_t width = rgb_frame.cols;
70-
int64_t height = rgb_frame.rows;
71-
int64_t channels = rgb_frame.channels();
72-
int64_t pixels = rgb_frame.total();
73-
int64_t size = pixels * channels;
74-
75-
chpl_external_array frame_data_ptr = chpl_make_external_array_ptr(rgb_frame.data, size);
76-
chpl_external_array new_frame_array = getNewFrame(&frame_data_ptr, width, height, channels);
77-
chpl_free_external_array(frame_data_ptr);
78-
79-
cv::Mat new_rgb_frame(height, width, CV_8UC3,new_frame_array.elts);
80-
cv::cvtColor(new_rgb_frame, new_rgb_frame, cv::COLOR_RGB2BGR);
44+
std::tuple<cv::Mat,std::size_t> ouput_package = {output_frame,chpl_end - chpl_start};
45+
return ouput_package;
8146

82-
return new_rgb_frame;
8347
}
84-
*/
85-
86-
/*
87-
void new_frame(cv::Mat &frame) {
88-
cv::Mat rgb_frame;
89-
cv::cvtColor(frame, rgb_frame, cv::COLOR_BGR2RGB);
90-
std::cout << "Frame size: " << rgb_frame.size() << std::endl;
91-
92-
// cv::MatSize size = rgb_frame.size;
93-
// std::cout << "x " << size[0] << " y " << size[1] << " channels " << rgb_frame.dims << std::endl;
94-
int64_t width = rgb_frame.cols;
95-
int64_t height = rgb_frame.rows;
96-
int64_t channels = rgb_frame.channels();
97-
int64_t size = rgb_frame.total() * channels;
98-
99-
std::cout << "Width: " << width << ", Height: " << height << ", Channels: " << channels << ", Size: " << size << std::endl;
100-
101-
// chpl_external_array frame_data_ptr = chpl_make_external_array_ptr(rgb_frame.data, );
102-
}*/
10348

10449

10550
int mirror() {
@@ -116,9 +61,12 @@ int mirror() {
11661
cv::Size original_frame_size;
11762
cv::Size processed_frame_size;
11863

64+
double last_frame_fps = 0.0;
65+
double last_chpl_fps = 0.0;
66+
11967
while (true) {
12068

121-
uint64_t start = cv::getTickCount();
69+
std::size_t frame_start = cv::getTickCount();
12270

12371
// Capture a new frame from webcam
12472
cap >> frame;
@@ -137,7 +85,9 @@ int mirror() {
13785
// std::cout << "Frame size: " << frame.size() << std::endl;
13886
// std::cout << "New frame size: " << processed_frame_size << std::endl;
13987

140-
cv::Mat next_frame = new_frame(frame);
88+
cv::Mat next_frame;
89+
std::size_t chpl_delta;
90+
std::tie(next_frame,chpl_delta) = new_frame(frame);
14191

14292
cv::resize(next_frame, next_frame, original_frame_size);
14393

@@ -150,10 +100,19 @@ int mirror() {
150100
break;
151101
}
152102

153-
double fps = cv::getTickFrequency() / (cv::getTickCount() - start);
154-
std::cout << "\rcv::FPS : " << fps << "\t\r" << std::flush;
103+
std::size_t frame_end = cv::getTickCount();
104+
105+
double frame_fps = cv::getTickFrequency() / (frame_end - frame_start);
106+
double chpl_fps = cv::getTickFrequency() / chpl_delta;
107+
std::cout << "\rcv::FPS : \t " << frame_fps << " chpl::FPS : \t " << chpl_fps << "\t\r" << std::flush;
108+
last_frame_fps = frame_fps;
109+
last_chpl_fps = chpl_fps;
155110
}
156111

112+
std::cout << "\nLast FPS: " << last_frame_fps << std::endl;
113+
std::cout << "Last CHPL FPS: " << last_chpl_fps << std::endl;
114+
std::cout << "Exiting webcam feed..." << std::endl;
115+
157116
// Release the camera and destroy all windows
158117
cap.release();
159118
cv::destroyAllWindows();
@@ -171,6 +130,11 @@ int main(int argc, char* argv[]) {
171130

172131
int code = mirror();
173132

133+
std::size_t start = cv::getTickCount();
134+
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
135+
std::size_t end = cv::getTickCount();
136+
std::cout << "Total time taken: " << (end - start) / cv::getTickFrequency() << " seconds" << std::endl;
137+
174138

175139
chpl_library_finalize();
176140
return code;

demos/video/chapel-webcam/smol.chpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use Layer;
33
import Utilities as util;
44

55
config const cpuScale: real = 0.2;
6-
config const accelScale: real = 0.45;
6+
config const accelScale: real = 0.8;
77
config const debugCPUOnly: bool = false;
88

99

lib/Bridge.chpl

Lines changed: 36 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -18,62 +18,6 @@ module Bridge {
1818
var was_freed: bool;
1919
}
2020

21-
// proc getSizeArray(const ref arr: [] ?eltType): [] int(32) {
22-
// var sizes: [0..<arr.rank] int(32);
23-
// for i in 0..<arr.rank do
24-
// sizes[i] = arr.dim(i).size : int(32);
25-
// return sizes;
26-
// }
27-
28-
// proc createBridgeTensor(const ref data: [] real(32)): bridge_tensor_t {
29-
// var result: bridge_tensor_t;
30-
// result.data = c_ptrToConst(data) : c_ptr(real(32));
31-
// result.sizes = allocate(uint(32),data.rank);
32-
// result.created_by_c = false;
33-
// const sizeArr = getSizeArray(data);
34-
// for i in 0..<data.rank do
35-
// result.sizes[i] = sizeArr[i];
36-
37-
// result.dim = data.rank;
38-
// return result;
39-
// }
40-
41-
class BridgeTensor {
42-
var handle: bridge_tensor_t;
43-
44-
proc init(bt: bridge_tensor_t) do
45-
this.handle = bt;
46-
47-
proc init(const ref data: [] real(32)) {
48-
var bt: bridge_tensor_t;
49-
bt.data = c_ptrToConst(data) : c_ptr(real(32));
50-
bt.sizes = allocate(uint(32),data.rank);
51-
bt.created_by_c = false;
52-
bt.was_freed = false;
53-
const sizeArr = getSizeArray(data);
54-
for i in 0..<data.rank do
55-
bt.sizes[i] = bt[i];
56-
bt.dim = data.rank;
57-
this.init(bt);
58-
}
59-
60-
proc deinit() {
61-
if this.handle.was_freed then
62-
util.err("BridgeTensor: Tensor has already been freed");
63-
if this.handle.created_by_c && !this.handle.was_freed {
64-
freeBridgeTensorHandle(this.handle);
65-
this.handle.was_freed = true;
66-
}
67-
}
68-
69-
proc getShape(param dim: int): dim*int {
70-
var shape: dim*int;
71-
for i in 0..<dim do
72-
shape[i] = handle.sizes[i] : int;
73-
return shape;
74-
}
75-
}
76-
7721
extern "free_bridge_tensor" proc freeBridgeTensorHandle(
7822
in tensor: bridge_tensor_t): void;
7923

@@ -261,5 +205,41 @@ module Bridge {
261205
return result;
262206
}
263207

208+
class BridgeTensor {
209+
var handle: bridge_tensor_t;
210+
211+
proc init(bt: bridge_tensor_t) do
212+
this.handle = bt;
213+
214+
proc init(const ref data: [] real(32)) {
215+
var bt: bridge_tensor_t;
216+
bt.data = c_ptrToConst(data) : c_ptr(real(32));
217+
bt.sizes = allocate(uint(32),data.rank);
218+
bt.created_by_c = false;
219+
bt.was_freed = false;
220+
const sizeArr = getSizeArray(data);
221+
for i in 0..<data.rank do
222+
bt.sizes[i] = bt[i];
223+
bt.dim = data.rank;
224+
this.init(bt);
225+
}
226+
227+
proc deinit() {
228+
if this.handle.was_freed then
229+
util.err("BridgeTensor: Tensor has already been freed");
230+
if this.handle.created_by_c && !this.handle.was_freed {
231+
freeBridgeTensorHandle(this.handle);
232+
this.handle.was_freed = true;
233+
}
234+
}
235+
236+
proc getShape(param dim: int): dim*int {
237+
var shape: dim*int;
238+
for i in 0..<dim do
239+
shape[i] = handle.sizes[i] : int;
240+
return shape;
241+
}
242+
}
243+
264244

265245
}

lib/DynamicTensor.chpl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,13 @@ operator :(in t: dynamicTensor(?eltType), type btType: Bridge.tensorHandle(eltTy
193193
halt("Could not identify rank for this: ", t);
194194
}
195195

196+
proc dynamicTensor.bridgeTensorHandle() {
197+
for param rank in 1..maxRank do
198+
if this.checkRank(rank) then
199+
return this.forceRank(rank).array.bridgeTensorHandle();
200+
halt("Could not identify rank for this: ", this);
201+
}
202+
196203
operator :(bt: Bridge.tensorHandle(real(32)), type tType: dynamicTensor(?eltType)): dynamicTensor(eltType) {
197204
for param rank in 1..maxRank do
198205
if bt.dim == rank then

lib/Layer.chpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ module Layer {
227227

228228
override proc forward(input: dynamicTensor(eltType)):
229229
dynamicTensor(eltType) {
230-
const th = input : Bridge.tensorHandle(eltType);
230+
const th = input.bridgeTensorHandle();
231231
const thOutput = Bridge.modelForward(this.torchModuleHandle,th);
232232
return thOutput : dynamicTensor(eltType);
233233
}

lib/NDArray.chpl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1268,7 +1268,10 @@ proc ndarray.degenerateFlatten(): [] eltType {
12681268
return flat;
12691269
}
12701270

1271-
proc ndarray.toBridgeTensor(): Bridge.tensorHandle(eltType) do
1271+
inline proc ndarray.bridgeTensorHandle(): Bridge.tensorHandle(eltType) do
1272+
return this.toBridgeTensor();
1273+
1274+
inline proc ndarray.toBridgeTensor(): Bridge.tensorHandle(eltType) do
12721275
return Bridge.createBridgeTensor(this.data);
12731276

12741277
proc type ndarray.fromBridgeTensor(param rank: int, handle: Bridge.tensorHandle(real(32))): ndarray(rank,real(32)) {

0 commit comments

Comments
 (0)