Skip to content

Commit b76330b

Browse files
committed
clang && codecov
1 parent 85a5c71 commit b76330b

3 files changed

Lines changed: 235 additions & 2 deletions

File tree

include/layers_oneDNN/EWLayer.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ class EwLayerOneDnn : public Layer {
3737
void initialize_onednn(const Shape& shape, Type data_type);
3838
[[nodiscard]] dnnl::algorithm get_algorithm() const;
3939
void validate_input(const std::vector<Tensor>& input) const;
40-
dnnl::memory::data_type get_dnnl_data_type(Type type) const;
40+
[[nodiscard]] static dnnl::memory::data_type get_dnnl_data_type(
41+
Type type);
4142

4243
std::string func_;
4344
float alpha_;

src/layers_oneDNN/EWLayer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void EwLayerOneDnn::initialize_onednn(const Shape& shape, Type data_type) {
182182
}
183183
}
184184

185-
dnnl::memory::data_type EwLayerOneDnn::get_dnnl_data_type(Type type) const {
185+
dnnl::memory::data_type EwLayerOneDnn::get_dnnl_data_type(Type type) {
186186
switch (type) {
187187
case Type::kFloat:
188188
return dnnl::memory::data_type::f32;

test/single_layer/test_ewlayer_onednn.cpp

Lines changed: 232 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,3 +304,235 @@ TEST(ewlayer_onednn, initialization_failure_propagation) {
304304
FAIL() << "Expected std::invalid_argument exception";
305305
}
306306
}
307+
308+
TEST(ewlayer_onednn, various_dimensions) {
309+
{
310+
EwLayerOneDnn layer("relu");
311+
Tensor input = make_tensor<float>({1.0F, -1.0F, 0.0F});
312+
Tensor output;
313+
std::vector<Tensor> in{input};
314+
std::vector<Tensor> out{output};
315+
316+
EXPECT_NO_THROW(layer.run(in, out));
317+
auto result = *out[0].as<float>();
318+
EXPECT_EQ(result.size(), 3);
319+
}
320+
321+
{
322+
EwLayerOneDnn layer("relu");
323+
Shape shape2d({2, 3});
324+
std::vector<float> data2d = {1, -1, 2, -2, 0, 3};
325+
Tensor input = make_tensor(data2d, shape2d);
326+
Tensor output;
327+
std::vector<Tensor> in{input};
328+
std::vector<Tensor> out{output};
329+
330+
EXPECT_NO_THROW(layer.run(in, out));
331+
}
332+
333+
{
334+
EwLayerOneDnn layer("relu");
335+
Shape shape3d({2, 2, 2});
336+
std::vector<float> data3d(8, 1.0f);
337+
Tensor input = make_tensor(data3d, shape3d);
338+
Tensor output;
339+
std::vector<Tensor> in{input};
340+
std::vector<Tensor> out{output};
341+
342+
EXPECT_NO_THROW(layer.run(in, out));
343+
}
344+
345+
{
346+
EwLayerOneDnn layer("relu");
347+
Shape shape4d({1, 2, 2, 2});
348+
std::vector<float> data4d(8, -1.0f);
349+
Tensor input = make_tensor(data4d, shape4d);
350+
Tensor output;
351+
std::vector<Tensor> in{input};
352+
std::vector<Tensor> out{output};
353+
354+
EXPECT_NO_THROW(layer.run(in, out));
355+
auto result = *out[0].as<float>();
356+
for (auto val : result) {
357+
EXPECT_EQ(val, 0.0f);
358+
}
359+
}
360+
361+
{
362+
EwLayerOneDnn layer("relu");
363+
Shape shape5d({1, 1, 2, 2, 2});
364+
std::vector<float> data5d(8, 2.0f);
365+
Tensor input = make_tensor(data5d, shape5d);
366+
Tensor output;
367+
std::vector<Tensor> in{input};
368+
std::vector<Tensor> out{output};
369+
370+
EXPECT_NO_THROW(layer.run(in, out));
371+
}
372+
}
373+
374+
TEST(ewlayer_onednn, linear_various_alpha_beta) {
375+
{
376+
EwLayerOneDnn layer("linear", 0.0f, 0.0f);
377+
Tensor input = make_tensor<float>({1.0F, 2.0F, -1.0F});
378+
Tensor output;
379+
std::vector<Tensor> in{input};
380+
std::vector<Tensor> out{output};
381+
382+
layer.run(in, out);
383+
auto result = *out[0].as<float>();
384+
for (auto val : result) {
385+
EXPECT_NEAR(val, 0.0f, 1e-5);
386+
}
387+
}
388+
389+
{
390+
EwLayerOneDnn layer("linear", 1.0f, 0.0f);
391+
Tensor input = make_tensor<float>({1.0F, 2.0F, -1.0F});
392+
Tensor output;
393+
std::vector<Tensor> in{input};
394+
std::vector<Tensor> out{output};
395+
396+
layer.run(in, out);
397+
auto result = *out[0].as<float>();
398+
auto input_data = *input.as<float>();
399+
for (size_t i = 0; i < result.size(); i++) {
400+
EXPECT_NEAR(result[i], input_data[i], 1e-5);
401+
}
402+
}
403+
404+
{
405+
EwLayerOneDnn layer("linear", 0.0f, 5.0f);
406+
Tensor input = make_tensor<float>({1.0F, 2.0F, -1.0F});
407+
Tensor output;
408+
std::vector<Tensor> in{input};
409+
std::vector<Tensor> out{output};
410+
411+
layer.run(in, out);
412+
auto result = *out[0].as<float>();
413+
for (auto val : result) {
414+
EXPECT_NEAR(val, 5.0f, 1e-5);
415+
}
416+
}
417+
418+
{
419+
EwLayerOneDnn layer("linear", -2.0f, 3.0f);
420+
Tensor input = make_tensor<float>({1.0F, 2.0F, -1.0F});
421+
Tensor output;
422+
std::vector<float> expected = {1.0f, -1.0f, 5.0f};
423+
424+
std::vector<Tensor> in{input};
425+
std::vector<Tensor> out{output};
426+
427+
layer.run(in, out);
428+
auto result = *out[0].as<float>();
429+
for (size_t i = 0; i < result.size(); i++) {
430+
EXPECT_NEAR(result[i], expected[i], 1e-5);
431+
}
432+
}
433+
}
434+
435+
TEST(ewlayer_onednn, reinitialization_for_int) {
436+
EwLayerOneDnn layer("relu");
437+
438+
{
439+
Tensor input = make_tensor<float>({1.0F, -1.0F});
440+
Tensor output;
441+
std::vector<Tensor> in{input};
442+
std::vector<Tensor> out{output};
443+
444+
layer.run(in, out);
445+
auto float_result = *out[0].as<float>();
446+
EXPECT_NEAR(float_result[0], 1.0f, 1e-5);
447+
EXPECT_NEAR(float_result[1], 0.0f, 1e-5);
448+
}
449+
450+
{
451+
Tensor input = make_tensor<int>({1, -1});
452+
Tensor output;
453+
std::vector<Tensor> in{input};
454+
std::vector<Tensor> out{output};
455+
456+
layer.run(in, out);
457+
auto int_result = *out[0].as<int>();
458+
EXPECT_EQ(int_result[0], 1);
459+
EXPECT_EQ(int_result[1], 0);
460+
}
461+
462+
{
463+
Tensor input = make_tensor<float>({2.0F, -2.0F});
464+
Tensor output;
465+
std::vector<Tensor> in{input};
466+
std::vector<Tensor> out{output};
467+
468+
layer.run(in, out);
469+
auto float_result = *out[0].as<float>();
470+
EXPECT_NEAR(float_result[0], 2.0f, 1e-5);
471+
EXPECT_NEAR(float_result[1], 0.0f, 1e-5);
472+
}
473+
}
474+
475+
TEST(ewlayer_onednn, edge_case_dimensions) {
476+
{
477+
EwLayerOneDnn layer("relu");
478+
Shape large_shape({1000});
479+
std::vector<float> large_data(1000);
480+
for (size_t i = 0; i < large_data.size(); i++) {
481+
large_data[i] = static_cast<float>(i) - 500.0f;
482+
}
483+
484+
Tensor input = make_tensor(large_data, large_shape);
485+
Tensor output;
486+
std::vector<Tensor> in{input};
487+
std::vector<Tensor> out{output};
488+
489+
EXPECT_NO_THROW(layer.run(in, out));
490+
auto result = *out[0].as<float>();
491+
EXPECT_EQ(result.size(), 1000);
492+
}
493+
494+
{
495+
EwLayerOneDnn layer("relu");
496+
Tensor input = make_tensor<float>({5.0F});
497+
Tensor output;
498+
std::vector<Tensor> in{input};
499+
std::vector<Tensor> out{output};
500+
501+
EXPECT_NO_THROW(layer.run(in, out));
502+
auto result = *out[0].as<float>();
503+
EXPECT_EQ(result.size(), 1);
504+
EXPECT_NEAR(result[0], 5.0f, 1e-5);
505+
}
506+
}
507+
508+
TEST(ewlayer_onednn, all_functions_int) {
509+
std::vector<std::pair<std::string, std::vector<int>>> test_cases = {
510+
{"relu", {1, 0, 2, 0}},
511+
{"linear", {3, -1, 5, -9}},
512+
};
513+
514+
for (const auto& [func, expected] : test_cases) {
515+
EwLayerOneDnn layer(func, 2.0f, 1.0f);
516+
517+
std::vector<int> input_data;
518+
if (func == "relu") {
519+
input_data = {1, -1, 2, -2};
520+
} else if (func == "linear") {
521+
input_data = {1, -1, 2, -5};
522+
}
523+
524+
Tensor input = make_tensor<int>(input_data);
525+
Tensor output;
526+
std::vector<Tensor> in{input};
527+
std::vector<Tensor> out{output};
528+
529+
EXPECT_NO_THROW(layer.run(in, out));
530+
auto result = *out[0].as<int>();
531+
532+
ASSERT_EQ(result.size(), expected.size());
533+
for (size_t i = 0; i < result.size(); i++) {
534+
EXPECT_EQ(result[i], expected[i])
535+
<< "Function: " << func << ", index: " << i;
536+
}
537+
}
538+
}

0 commit comments

Comments
 (0)