Skip to content

Commit 92b241e

Browse files
authored
Improve demos (Iainmon#73)
Improve the performance and user interface for the `demos/video/chapel-webcam` style transfer demo. - Add scaling for CPU and accelerator options for faster FPS - Use inplace tensor operations for faster computation - Disable gradient tracking for loaded models. - and more -
2 parents b322889 + 07e13d6 commit 92b241e

19 files changed

Lines changed: 890 additions & 80 deletions

CMakeLists.txt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -228,12 +228,8 @@ add_dependencies(TinyLayerTest ChAI)
228228
target_link_options(TinyLayerTest
229229
PRIVATE
230230
--main-module layer_test.chpl
231-
-M ${PROJECT_ROOT_DIR}/lib
232-
${BRIDGE_DIR}/include/bridge.h
233-
${BRIDGE_OBJECT_FILES}
234-
-L ${LIBTORCH_DIR}/lib
235-
${LIBTORCH_LIBS_LINKER_ARGS}
236-
--ldflags "-Wl,-rpath,${LIBTORCH_DIR}/lib"
231+
# -M ${PROJECT_ROOT_DIR}/lib
232+
${CHAI_LINKER_ARGS}
237233
)
238234
# chpl test/tiny/layer_test.chpl -M lib bridge/include/bridge.h build/CMakeFiles/bridge.dir/bridge/lib/bridge.cpp.o -L libtorch/lib -ltorch -ltorch_cpu -lc10 -ltorch_global_deps --ldflags "-Wl,-rpath,libtorch/lib"
239235

bridge/.DS_Store

0 Bytes
Binary file not shown.

bridge/include/bridge.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ typedef unsigned char uint8_t;
1717
typedef unsigned int uint32_t;
1818
typedef unsigned long long uint64_t;
1919

20+
void debug_cpu_only_mode(bool_t mode);
21+
2022
typedef struct bridge_tensor_t {
2123
float* data;
2224
int* sizes;
@@ -51,9 +53,9 @@ bridge_tensor_t load_run_model(const uint8_t* model_path, bridge_tensor_t input)
5153

5254
bridge_pt_model_t load_model(const uint8_t* model_path);
5355

54-
bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input);
55-
56+
bool_t accelerator_available(void);
5657

58+
bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input);
5759
bridge_tensor_t model_forward_style_transfer(bridge_pt_model_t model, bridge_tensor_t input);
5860

5961
bridge_tensor_t resize(bridge_tensor_t input,int height,int width);

bridge/lib/bridge.cpp

Lines changed: 83 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include <bridge.h>
22

33
#include <torch/torch.h>
4+
#include <Aten/ATen.h>
5+
46
#include <torch/script.h>
57

68
// #include <torch/script.h>
@@ -27,6 +29,58 @@
2729

2830

2931

32+
// Globals
33+
34+
35+
torch::Device get_best_device();
36+
torch::ScalarType get_best_dtype();
37+
38+
auto best_device = get_best_device();
39+
auto best_dtype = get_best_dtype();
40+
41+
torch::NoGradGuard no_grad;
42+
torch::AutoGradMode enable_grad(false);
43+
44+
bool debug_cpu_only = false;
45+
46+
47+
48+
torch::Device get_best_device() {
49+
if (debug_cpu_only)
50+
return torch::Device(torch::kCPU);
51+
52+
if (torch::hasMPS()) {
53+
return torch::Device(torch::kMPS);
54+
} else if (torch::hasCUDA()) {
55+
return torch::Device(torch::kCUDA);
56+
} else {
57+
return torch::Device(torch::kCPU);
58+
}
59+
}
60+
61+
extern "C" void debug_cpu_only_mode(bool_t mode) {
62+
debug_cpu_only = mode;
63+
if (debug_cpu_only) {
64+
best_device = torch::Device(torch::kCPU);
65+
} else {
66+
best_device = get_best_device();
67+
}
68+
}
69+
70+
extern "C" bool_t accelerator_available() {
71+
return (best_device == torch::Device(torch::kCUDA) || best_device == torch::Device(torch::kMPS));
72+
}
73+
74+
torch::ScalarType get_best_dtype() {
75+
if (torch::hasMPS()) {
76+
return torch::kFloat16;
77+
} else if (torch::hasCUDA()) {
78+
return torch::kFloat16;
79+
} else {
80+
return torch::kFloat32;
81+
}
82+
}
83+
3084
int bridge_tensor_elements(bridge_tensor_t &bt) {
3185
int size = 1;
3286
for (int i = 0; i < bt.dim; ++i) {
@@ -39,14 +93,14 @@ size_t bridge_tensor_size(bridge_tensor_t &bt) {
3993
return sizeof(float32_t) * bridge_tensor_elements(bt);
4094
}
4195

42-
void store_tensor(torch::Tensor &input, float32_t* dest) {
96+
void store_tensor(at::Tensor &input, float32_t* dest) {
4397
float32_t * data = input.data_ptr<float32_t>();
4498
size_t bytes_size = sizeof(float32_t) * input.numel();
4599
// std::memmove(dest,data,bytes_size);
46100
std::memcpy(dest,data,bytes_size);
47101
}
48102

49-
bridge_tensor_t torch_to_bridge(torch::Tensor &tensor) {
103+
bridge_tensor_t torch_to_bridge(at::Tensor &tensor) {
50104
bridge_tensor_t result;
51105
result.created_by_c = true;
52106
result.dim = tensor.dim();
@@ -59,13 +113,13 @@ bridge_tensor_t torch_to_bridge(torch::Tensor &tensor) {
59113
return result;
60114
}
61115

62-
torch::Tensor bridge_to_torch(bridge_tensor_t &bt) {
116+
at::Tensor bridge_to_torch(bridge_tensor_t &bt) {
63117
std::vector<int64_t> sizes_vec(bt.sizes, bt.sizes + bt.dim);
64118
auto shape = torch::IntArrayRef(sizes_vec);
65119
return torch::from_blob(bt.data, shape, torch::kFloat);
66120
}
67121

68-
torch::Tensor bridge_to_torch(bridge_tensor_t &bt,torch::Device device, bool copy,torch::ScalarType dtype = torch::kFloat32) {
122+
at::Tensor bridge_to_torch(bridge_tensor_t &bt,torch::Device device, bool copy,torch::ScalarType dtype = torch::kFloat32) {
69123
std::vector<int64_t> sizes_vec(bt.sizes, bt.sizes + bt.dim);
70124
auto shape = torch::IntArrayRef(sizes_vec);
71125
auto t = torch::from_blob(bt.data, shape, torch::kFloat);
@@ -144,6 +198,8 @@ extern "C" bridge_tensor_t load_run_model(const uint8_t* model_path, bridge_tens
144198
}
145199

146200

201+
202+
147203
extern "C" bridge_pt_model_t load_model(const uint8_t* model_path) {
148204

149205
std::cout << "Begin loading model from path: " << model_path << std::endl;
@@ -153,21 +209,12 @@ extern "C" bridge_pt_model_t load_model(const uint8_t* model_path) {
153209
std::cout.flush();
154210

155211
try {
156-
157212
auto* module = new torch::jit::Module(torch::jit::load(path));
158-
module->to(torch::kMPS,torch::kFloat16,false);
213+
module->to(best_device,best_dtype,false);
159214
module->eval();
160215
std::cout << "Model loaded successfully!" << std::endl;
161216
std::cout.flush();
162217
return { static_cast<void*>(module) };
163-
164-
// torch::jit::Module tmp = torch::jit::load(path);
165-
// std::cout << "Model loaded successfully!" << std::endl;
166-
// std::cout.flush();
167-
// auto* module = new torch::jit::Module(std::move(tmp));
168-
// std::cout << "Model moved successfully!" << std::endl;
169-
// std::cout.flush();
170-
// return { static_cast<void*>(module) };
171218
} catch (const c10::Error& e) {
172219
std::cerr << "error loading the model\n" << e.msg();
173220
std::cout << "error loading the model\n" << e.msg();
@@ -178,49 +225,30 @@ extern "C" bridge_pt_model_t load_model(const uint8_t* model_path) {
178225
std::cout.flush();
179226

180227
return { nullptr };
181-
182-
183-
184-
// bridge_pt_model_t model_wrapper;
185-
// torch::jit::Module* pt_module = new torch::jit::Module(); // = (torch::jit::Module*) model_wrapper.pt_module;
186-
// try {
187-
// *pt_module = torch::jit::load(mp);
188-
// std::cout << "Model loaded successfully!" << std::endl;
189-
// std::cout.flush();
190-
// model_wrapper.pt_module = pt_module;
191-
// } catch (const c10::Error& e) {
192-
// std::cerr << "error loading the model\n" << e.msg();
193-
// std::cout << "error loading the model\n" << e.msg();
194-
// std::cout.flush();
195-
// std::cerr.flush();
196-
// }
197-
198-
// std::cout << pt_module->dump_to_str(false,false,false) << std::endl;
199-
// std::cout.flush();
200-
201-
// return model_wrapper;
202228
}
203229

204230

205231

206232
bridge_tensor_t model_forward(bridge_pt_model_t model, bridge_tensor_t input, bool is_vgg_based_model) {
207-
208-
auto tn_mps = bridge_to_torch(input,torch::kMPS,true,torch::kFloat16);
209-
// auto tn_mps = tn.to(torch::kMPS,false,true);
233+
auto tn_mps = bridge_to_torch(input,best_device,true,best_dtype);
234+
// tn_mps = tn_mps.permute({2, 0, 1}).contiguous();
235+
// tn_mps.unsqueeze_(0);//.contiguous();
210236
auto tn = tn_mps.permute({2, 0, 1}).unsqueeze(0).contiguous();
211237

212238
std::vector<torch::jit::IValue> ins;
213239
ins.push_back(tn);
214240

215241
auto* module = static_cast<torch::jit::Module*>(model.pt_module);
216242
auto o = module->forward(ins).toTensor();
243+
// auto tn_out = o.squeeze(0).permute({1, 2, 0}).contiguous();
217244
auto tn_out = o.squeeze(0).contiguous().permute({1, 2, 0}).contiguous();
218245

219246
if (is_vgg_based_model) {
220-
tn_out = tn_out / 255.0;
247+
tn_out.div_(255.0);
221248
}
222249

223250
auto tn_out_cpu = tn_out.to(torch::kCPU,torch::kFloat32,false,true);
251+
224252
return torch_to_bridge(tn_out_cpu);
225253

226254
}
@@ -233,6 +261,22 @@ extern "C" bridge_tensor_t model_forward_style_transfer(bridge_pt_model_t model,
233261
return model_forward(model, input, true);
234262
}
235263

264+
// std::tuple<uint64_t, uint64_t> get_cpu_frame_size(uint64_t width, uint64_t height, float32_t scale_factor) {
265+
// // if (best_device == torch::kMPS || best_device == torch::kCUDA)
266+
// if (accelerator_available())
267+
// return std::make_tuple(width, height);
268+
// uint64_t new_width = static_cast<uint64_t>(width * scale_factor);
269+
// uint64_t new_height = static_cast<uint64_t>(height * scale_factor);
270+
// return std::make_tuple(new_width, new_height);
271+
// }
272+
273+
// extern "C" uint64_t get_cpu_frame_width(uint64_t width,float32_t scale_factor) {
274+
// return std::get<0>(get_cpu_frame_size(width, 0, scale_factor));
275+
// }
276+
// extern "C" uint64_t get_cpu_frame_height(uint64_t height,float32_t scale_factor) {
277+
// return std::get<1>(get_cpu_frame_size(0, height, scale_factor));
278+
// }
279+
236280

237281
extern "C" void hello_world(void) {
238282
std::cout << "Hello from C++!" << std::endl;

demos/models/readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
This folder contains the model architectures used in the demos.

demos/models/transformer_net.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
import torch
2+
3+
4+
class TransformerNet(torch.nn.Module):
5+
def __init__(self):
6+
super(TransformerNet, self).__init__()
7+
# Initial convolution layers
8+
self.conv1 = ConvLayer(3, 32, kernel_size=9, stride=1)
9+
self.in1 = torch.nn.InstanceNorm2d(32, affine=True)
10+
self.conv2 = ConvLayer(32, 64, kernel_size=3, stride=2)
11+
self.in2 = torch.nn.InstanceNorm2d(64, affine=True)
12+
self.conv3 = ConvLayer(64, 128, kernel_size=3, stride=2)
13+
self.in3 = torch.nn.InstanceNorm2d(128, affine=True)
14+
# Residual layers
15+
self.res1 = ResidualBlock(128)
16+
self.res2 = ResidualBlock(128)
17+
self.res3 = ResidualBlock(128)
18+
self.res4 = ResidualBlock(128)
19+
self.res5 = ResidualBlock(128)
20+
# Upsampling Layers
21+
self.deconv1 = UpsampleConvLayer(128, 64, kernel_size=3, stride=1, upsample=2)
22+
self.in4 = torch.nn.InstanceNorm2d(64, affine=True)
23+
self.deconv2 = UpsampleConvLayer(64, 32, kernel_size=3, stride=1, upsample=2)
24+
self.in5 = torch.nn.InstanceNorm2d(32, affine=True)
25+
self.deconv3 = ConvLayer(32, 3, kernel_size=9, stride=1)
26+
# Non-linearities
27+
self.relu = torch.nn.ReLU()
28+
29+
def forward(self, X):
30+
y = self.relu(self.in1(self.conv1(X)))
31+
y = self.relu(self.in2(self.conv2(y)))
32+
y = self.relu(self.in3(self.conv3(y)))
33+
y = self.res1(y)
34+
y = self.res2(y)
35+
y = self.res3(y)
36+
y = self.res4(y)
37+
y = self.res5(y)
38+
y = self.relu(self.in4(self.deconv1(y)))
39+
y = self.relu(self.in5(self.deconv2(y)))
40+
y = self.deconv3(y)
41+
return y
42+
43+
44+
class ConvLayer(torch.nn.Module):
45+
def __init__(self, in_channels, out_channels, kernel_size, stride):
46+
super(ConvLayer, self).__init__()
47+
reflection_padding = kernel_size // 2
48+
self.reflection_pad = torch.nn.ReflectionPad2d(reflection_padding)
49+
self.conv2d = torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride)
50+
51+
def forward(self, x):
52+
out = self.reflection_pad(x)
53+
out = self.conv2d(out)
54+
return out
55+
56+
57+
class ResidualBlock(torch.nn.Module):
58+
"""ResidualBlock
59+
introduced in: https://arxiv.org/abs/1512.03385
60+
recommended architecture: http://torch.ch/blog/2016/02/04/resnets.html
61+
"""
62+
63+
def __init__(self, channels):
64+
super(ResidualBlock, self).__init__()
65+
self.conv1 = ConvLayer(channels, channels, kernel_size=3, stride=1)
66+
self.in1 = torch.nn.InstanceNorm2d(channels, affine=True)
67+
self.conv2 = ConvLayer(channels, channels, kernel_size=3, stride=1)
68+
self.in2 = torch.nn.InstanceNorm2d(channels, affine=True)
69+
self.relu = torch.nn.ReLU()
70+
71+
def forward(self, x):
72+
residual = x
73+
out = self.relu(self.in1(self.conv1(x)))
74+
out = self.in2(self.conv2(out))
75+
out = out + residual
76+
return out
77+
78+
79+
class UpsampleConvLayer(torch.nn.Module):
80+
"""UpsampleConvLayer
81+
Upsamples the input and then does a convolution. This method gives better results
82+
compared to ConvTranspose2d.
83+
ref: http://distill.pub/2016/deconv-checkerboard/
84+
"""
85+
86+
def __init__(self, in_channels, out_channels, kernel_size, stride, upsample):
87+
super(UpsampleConvLayer, self).__init__()
88+
# self.upsample = upsample
89+
self.upsample = torch.nn.Upsample(scale_factor=2, mode='nearest')
90+
reflection_padding = kernel_size // 2
91+
self.reflection_pad = torch.nn.ReflectionPad2d(reflection_padding)
92+
self.conv2d = torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride)
93+
94+
def forward(self, x):
95+
x_in = x
96+
# print('upsample', self.upsample)
97+
# x_in = torch.nn.functional.interpolate(x_in, mode='nearest', scale_factor=self.upsample)
98+
# if self.upsample:
99+
# x_in = torch.nn.functional.interpolate(x_in, mode='nearest', scale_factor=self.upsample)
100+
out = self.upsample(x_in)
101+
out = self.reflection_pad(out)
102+
out = self.conv2d(out)
103+
return out

demos/video/chapel-webcam/lib/Makefile.smol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ CHPL_THIRD_PARTY = /opt/homebrew/Cellar/chapel/2.4.0_1/libexec/third-party
66

77
CHPL_HOME = /opt/homebrew/Cellar/chapel/2.4.0_1/libexec
88

9-
CHPL_CFLAGS = -Ilib -Wno-unused -Wno-uninitialized -Wno-pointer-sign -Wno-incompatible-pointer-types -Wno-tautological-compare -I/opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/internal -I/opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/packages -I$(CHPL_RUNTIME_INCL)/localeModels/flat -I$(CHPL_RUNTIME_INCL)/localeModels -I$(CHPL_RUNTIME_INCL)/comm/none -I$(CHPL_RUNTIME_INCL)/comm -I$(CHPL_RUNTIME_INCL)/tasks/qthreads -I$(CHPL_RUNTIME_INCL)/. -I$(CHPL_RUNTIME_INCL)/./qio -I$(CHPL_RUNTIME_INCL)/./atomics/cstdlib -I$(CHPL_RUNTIME_INCL)/./mem/jemalloc -I$(CHPL_THIRD_PARTY)/utf8-decoder -I$(CHPL_THIRD_PARTY)/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/include -Wno-error=unused-variable -I$(CHPL_THIRD_PARTY)/re2/install/darwin-arm64-native-llvm-none/include -I. -I/opt/homebrew/Cellar/gmp/6.3.0/include -I/opt/homebrew/Cellar/hwloc/2.12.0/include -I/opt/homebrew/Cellar/jemalloc/5.3.0/include -I/opt/homebrew/include
9+
CHPL_CFLAGS = -Ilib -Wno-unused -Wno-uninitialized -Wno-pointer-sign -Wno-incompatible-pointer-types -Wno-tautological-compare -I/opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/internal -I/opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/packages -I../../../lib -I$(CHPL_RUNTIME_INCL)/localeModels/flat -I$(CHPL_RUNTIME_INCL)/localeModels -I$(CHPL_RUNTIME_INCL)/comm/none -I$(CHPL_RUNTIME_INCL)/comm -I$(CHPL_RUNTIME_INCL)/tasks/qthreads -I$(CHPL_RUNTIME_INCL)/. -I$(CHPL_RUNTIME_INCL)/./qio -I$(CHPL_RUNTIME_INCL)/./atomics/cstdlib -I$(CHPL_RUNTIME_INCL)/./mem/jemalloc -I$(CHPL_THIRD_PARTY)/utf8-decoder -I$(CHPL_THIRD_PARTY)/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/include -Wno-error=unused-variable -I$(CHPL_THIRD_PARTY)/re2/install/darwin-arm64-native-llvm-none/include -I. -I/opt/homebrew/Cellar/gmp/6.3.0/include -I/opt/homebrew/Cellar/hwloc/2.12.0/include -I/opt/homebrew/Cellar/jemalloc/5.3.0/include -I/opt/homebrew/include
1010

1111
CHPL_LDFLAGS = -Llib -lsmol -ltorch -ltorch_cpu -lc10 -ltorch_global_deps -lbridge_objs -L$(CHPL_RUNTIME_LIB)/darwin/llvm/arm64/cpu-native/loc-flat/comm-none/tasks-qthreads/tmr-generic/unwind-none/mem-jemalloc/atomics-cstdlib/hwloc-system/re2-bundled/fs-none/lib_pic-none/san-none -lchpl -L$(CHPL_THIRD_PARTY)/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/lib -Wl,-rpath,$(CHPL_THIRD_PARTY)/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/lib -lqthread -L/opt/homebrew/Cellar/hwloc/2.12.0/lib -L$(CHPL_THIRD_PARTY)/re2/install/darwin-arm64-native-llvm-none/lib -lre2 -Wl,-rpath,$(CHPL_THIRD_PARTY)/re2/install/darwin-arm64-native-llvm-none/lib -lm -lpthread -L/opt/homebrew/Cellar/gmp/6.3.0/lib -lgmp -L/opt/homebrew/Cellar/hwloc/2.12.0/lib -Wl,-rpath,/opt/homebrew/Cellar/hwloc/2.12.0/lib -lhwloc -L/opt/homebrew/Cellar/jemalloc/5.3.0/lib -Wl,-rpath,/opt/homebrew/Cellar/jemalloc/5.3.0/lib -ljemalloc -L/opt/homebrew/lib
1212

demos/video/chapel-webcam/lib/smol.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ set(CHPL_THIRD_PARTY /opt/homebrew/Cellar/chapel/2.4.0_1/libexec/third-party)
66

77
set(CHPL_HOME /opt/homebrew/Cellar/chapel/2.4.0_1/libexec)
88

9-
set(smol_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR} /opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/internal /opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/packages ${CHPL_RUNTIME_INCL}/localeModels/flat ${CHPL_RUNTIME_INCL}/localeModels ${CHPL_RUNTIME_INCL}/comm/none ${CHPL_RUNTIME_INCL}/comm ${CHPL_RUNTIME_INCL}/tasks/qthreads ${CHPL_RUNTIME_INCL}/. ${CHPL_RUNTIME_INCL}/./qio ${CHPL_RUNTIME_INCL}/./atomics/cstdlib ${CHPL_RUNTIME_INCL}/./mem/jemalloc ${CHPL_THIRD_PARTY}/utf8-decoder ${CHPL_THIRD_PARTY}/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/include -Wno-error=unused-variable ${CHPL_THIRD_PARTY}/re2/install/darwin-arm64-native-llvm-none/include . /opt/homebrew/Cellar/gmp/6.3.0/include /opt/homebrew/Cellar/hwloc/2.12.0/include /opt/homebrew/Cellar/jemalloc/5.3.0/include /opt/homebrew/include)
9+
set(smol_INCLUDE_DIRS ${CMAKE_CURRENT_LIST_DIR} /opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/internal /opt/homebrew/Cellar/chapel/2.4.0_1/libexec/modules/packages ../../../lib ${CHPL_RUNTIME_INCL}/localeModels/flat ${CHPL_RUNTIME_INCL}/localeModels ${CHPL_RUNTIME_INCL}/comm/none ${CHPL_RUNTIME_INCL}/comm ${CHPL_RUNTIME_INCL}/tasks/qthreads ${CHPL_RUNTIME_INCL}/. ${CHPL_RUNTIME_INCL}/./qio ${CHPL_RUNTIME_INCL}/./atomics/cstdlib ${CHPL_RUNTIME_INCL}/./mem/jemalloc ${CHPL_THIRD_PARTY}/utf8-decoder ${CHPL_THIRD_PARTY}/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/include -Wno-error=unused-variable ${CHPL_THIRD_PARTY}/re2/install/darwin-arm64-native-llvm-none/include . /opt/homebrew/Cellar/gmp/6.3.0/include /opt/homebrew/Cellar/hwloc/2.12.0/include /opt/homebrew/Cellar/jemalloc/5.3.0/include /opt/homebrew/include)
1010

1111
set(smol_LINK_LIBS -L${CMAKE_CURRENT_LIST_DIR} -lsmol -ltorch -ltorch_cpu -lc10 -ltorch_global_deps -lbridge_objs -L${CHPL_RUNTIME_LIB}/darwin/llvm/arm64/cpu-native/loc-flat/comm-none/tasks-qthreads/tmr-generic/unwind-none/mem-jemalloc/atomics-cstdlib/hwloc-system/re2-bundled/fs-none/lib_pic-none/san-none -lchpl -L${CHPL_THIRD_PARTY}/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/lib -Wl,-rpath,${CHPL_THIRD_PARTY}/qthread/install/darwin-arm64-native-llvm-none-flat-jemalloc-system/lib -lqthread -L/opt/homebrew/Cellar/hwloc/2.12.0/lib -L${CHPL_THIRD_PARTY}/re2/install/darwin-arm64-native-llvm-none/lib -lre2 -Wl,-rpath,${CHPL_THIRD_PARTY}/re2/install/darwin-arm64-native-llvm-none/lib -lm -lpthread -L/opt/homebrew/Cellar/gmp/6.3.0/lib -lgmp -L/opt/homebrew/Cellar/hwloc/2.12.0/lib -Wl,-rpath,/opt/homebrew/Cellar/hwloc/2.12.0/lib -lhwloc -L/opt/homebrew/Cellar/jemalloc/5.3.0/lib -Wl,-rpath,/opt/homebrew/Cellar/jemalloc/5.3.0/lib -ljemalloc -L/opt/homebrew/lib -lsmol)
1212

0 commit comments

Comments
 (0)