Skip to content

Commit 017ce72

Browse files
Optimized iteration incase of padding
1 parent 2d56c56 commit 017ce72

File tree

3 files changed

+38
-26
lines changed

3 files changed

+38
-26
lines changed

c_reference/include/conv1d.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ typedef struct ConvLayers_Params{
2121

2222

2323
int Conv1D(float *output_signal, unsigned out_T, unsigned out_channels, const float *input_signal,
24-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
24+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
2525
const void* params, int activations);
2626

2727
int Conv1D_Depth(float *output_signal, unsigned out_T, const float *input_signal,
28-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
28+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
2929
const void* params, int activations);
3030

3131
// Low Rank
@@ -46,15 +46,15 @@ typedef struct ConvLayers_LR_Params{
4646
} ConvLayers_LR_Params;
4747

4848
int Conv1D_LR(float *output_signal, unsigned out_T, unsigned out_channels, const float *input_signal,
49-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
49+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
5050
const void* params, int activations);
5151

5252
int Conv1D_Depth_LR(float *output_signal, unsigned out_T, const float *input_signal,
53-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
53+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
5454
const void* params, int activations);
5555

5656
//Pool
57-
int AvgPool1D(float *output_signal, unsigned out_T, const float *input_signal, unsigned N, unsigned in_T, unsigned in_channels,
57+
int AvgPool1D(float *output_signal, unsigned out_T, const float *input_signal, unsigned in_T, unsigned in_channels,
5858
int padding, unsigned kernel_size, int activations);
5959

6060
#endif

c_reference/src/conv1d.c

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
#include<stdio.h>
66

77
int Conv1D_LR(float *output_signal, unsigned out_T, unsigned out_channels, const float *input_signal,
8-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
8+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
99
const void* params, int activations){
1010

1111
const ConvLayers_LR_Params* tparams= (ConvLayers_LR_Params*) params;
@@ -25,8 +25,10 @@ int Conv1D_LR(float *output_signal, unsigned out_T, unsigned out_channels, const
2525
float sum = 0;
2626
for(int tf = 0 ; tf < kernel_size ; tf++ ){
2727
for(int ci = 0 ; ci < in_channels ; ci++){
28-
float a = ((((t + tf) < padding) || ((t + tf) >= (in_T + padding))) ? 0 : input_signal[((tf + t) - padding) * in_channels + ci]);
29-
sum += (a * tempW[co * in_channels * kernel_size + ci * kernel_size + tf]);
28+
if(((t + tf) < padding) || ((t + tf) >= (in_T + padding)))
29+
continue;
30+
else
31+
sum += (input_signal[((tf + t) - padding) * in_channels + ci] * tempW[co * in_channels * kernel_size + ci * kernel_size + tf]);
3032
}
3133
}
3234
if(activations == 1){
@@ -48,7 +50,7 @@ int Conv1D_LR(float *output_signal, unsigned out_T, unsigned out_channels, const
4850
}
4951

5052
int Conv1D_Depth_LR(float *output_signal, unsigned out_T, const float *input_signal,
51-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
53+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
5254
const void* params, int activations){
5355

5456
const ConvLayers_LR_Params* tparams= (ConvLayers_LR_Params*) params;
@@ -67,8 +69,10 @@ int Conv1D_Depth_LR(float *output_signal, unsigned out_T, const float *input_sig
6769
for(int ci = 0; ci < in_channels ; ci++){
6870
float sum = 0;
6971
for(int tf = 0 ; tf < kernel_size ; tf++ ){
70-
float a = ((((t + tf) < padding) || ((t + tf) >= (in_T + padding))) ? 0 : input_signal[((tf + t) - padding) * in_channels + ci]);
71-
sum += (a * tempW[ci * kernel_size + tf]);
72+
if(((t + tf) < padding) || ((t + tf) >= (in_T + padding)))
73+
continue;
74+
else
75+
sum += (input_signal[((tf + t) - padding) * in_channels + ci] * tempW[ci * kernel_size + tf]);
7276
}
7377
if(activations == 1){
7478
output_signal[t * in_channels + ci] = sigmoid(sum + tparams->B[ci]);
@@ -91,7 +95,7 @@ int Conv1D_Depth_LR(float *output_signal, unsigned out_T, const float *input_sig
9195

9296

9397
int Conv1D(float *output_signal, unsigned out_T, unsigned out_channels, const float *input_signal,
94-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
98+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
9599
const void* params, int activations){
96100

97101
const ConvLayers_Params* tparams= (ConvLayers_Params*) params;
@@ -109,8 +113,10 @@ int Conv1D(float *output_signal, unsigned out_T, unsigned out_channels, const fl
109113
sum = 0;
110114
for(int tf = 0 ; tf < kernel_size ; tf++ ){
111115
for(int ci = 0 ; ci < in_channels ; ci++){
112-
float a = ((((t + tf) < padding) || ((t + tf) >= (in_T + padding))) ? 0 : input_signal[((tf + t) - padding) * in_channels + ci]);
113-
sum += (a * tparams->W[co * in_channels * kernel_size + ci * kernel_size + tf]);
116+
if(((t + tf) < padding) || ((t + tf) >= (in_T + padding)))
117+
continue;
118+
else
119+
sum += (input_signal[((tf + t) - padding) * in_channels + ci] * tparams->W[co * in_channels * kernel_size + ci * kernel_size + tf]);
114120
}
115121
}
116122
if(activations == 1){
@@ -131,7 +137,7 @@ int Conv1D(float *output_signal, unsigned out_T, unsigned out_channels, const fl
131137
}
132138

133139
int Conv1D_Depth(float *output_signal, unsigned out_T, const float *input_signal,
134-
unsigned N, unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
140+
unsigned in_T, unsigned in_channels, int padding, unsigned kernel_size,
135141
const void* params, int activations){
136142

137143
const ConvLayers_Params* tparams= (ConvLayers_Params*) params;
@@ -148,8 +154,10 @@ int Conv1D_Depth(float *output_signal, unsigned out_T, const float *input_signal
148154
for(int ci = 0; ci < in_channels ; ci++){
149155
float sum = 0;
150156
for(int tf = 0 ; tf < kernel_size ; tf++ ){
151-
float a = ((((t + tf) < padding) || ((t + tf) >= (in_T + padding))) ? 0 : input_signal[((tf + t) - padding) * in_channels + ci]);
152-
sum += (a * tparams->W[ci * kernel_size + tf]);
157+
if(((t + tf) < padding) || ((t + tf) >= (in_T + padding)))
158+
continue;
159+
else
160+
sum += (input_signal[((tf + t) - padding) * in_channels + ci] * tparams->W[ci * kernel_size + tf]);
153161
}
154162
if(activations == 1){
155163
output_signal[t * in_channels + ci] = sigmoid(sum + tparams->B[ci]);
@@ -168,7 +176,7 @@ int Conv1D_Depth(float *output_signal, unsigned out_T, const float *input_signal
168176
return 0;
169177
}
170178

171-
int AvgPool1D(float *output_signal, unsigned out_T, const float *input_signal, unsigned N, unsigned in_T, unsigned in_channels,
179+
int AvgPool1D(float *output_signal, unsigned out_T, const float *input_signal, unsigned in_T, unsigned in_channels,
172180
int padding, unsigned kernel_size, int activations){
173181

174182
if(padding == -1){
@@ -179,7 +187,10 @@ int AvgPool1D(float *output_signal, unsigned out_T, const float *input_signal, u
179187
for(int ci = 0 ; ci < in_channels; ci++){
180188
float sum = 0;
181189
for(int tf = 0; tf < kernel_size ; tf++){
182-
sum += ((((t + tf) < padding) || ((t + tf) >= (in_T + padding))) ? 0 : input_signal[((tf + t) - padding) * in_channels + ci]);
190+
if(((t + tf) < padding) || ((t + tf) >= (in_T + padding)))
191+
continue;
192+
else
193+
sum += (input_signal[((tf + t) - padding) * in_channels + ci]);
183194
}
184195
if(activations == 1){
185196
output_signal[t * in_channels + ci] = sigmoid(sum);

c_reference/src/conv_utils.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,16 @@
33
#include <float.h>
44

55
int prepareLowRankConvMat(float* out, float* W1, float* W2, unsigned rank, unsigned I, unsigned J){
6-
for(int i = 0 ; i < I; i++){
7-
for(int j = 0 ; j < J; j++){
8-
float sum = 0;
9-
for(int k = 0; k < rank ; k++){
10-
sum += (W1[i * rank + k] * W2[k * J + j]);
11-
}
12-
out[i * J + j] = sum;
6+
for(int i = 0 ; i < I; i++){
7+
for(int j = 0 ; j < J; j++){
8+
float sum = 0;
9+
for(int k = 0; k < rank ; k++){
10+
sum += (W1[i * rank + k] * W2[k * J + j]);
1311
}
12+
out[i * J + j] = sum;
1413
}
14+
}
15+
return 0;
1516
}
1617

1718
float relu(float x) {

0 commit comments

Comments
 (0)