From b76ad972d159371c7ddbff64d27bdfabf854572d Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Thu, 27 Mar 2014 11:06:24 +0100 Subject: [PATCH] erasure-code: test jerasure SSE optimized plugins selection Test the selection of the plugin depending on the CPU features. The prefix of the plugin is "jerasure" by default (jerasure_generic, jerasure_sse3, jerasure_sse4) and can be modified with the "jerasure-name" parameter. A test plugin is created for each variant (test_jerasure_generic, test_jerasure_sse3, test_jerasure_sse4). The flags set by ceph_probe are modified by the test to check if the expected plugin suffix is appended. Signed-off-by: Loic Dachary --- .../ErasureCodePluginSelectJerasure.cc | 9 +- src/test/erasure-code/Makefile.am | 21 +++++ .../TestErasureCodePluginJerasure.cc | 93 +++++++++++++++++-- .../erasure-code/TestJerasurePluginGeneric.cc | 23 +++++ .../erasure-code/TestJerasurePluginSSE3.cc | 23 +++++ .../erasure-code/TestJerasurePluginSSE4.cc | 23 +++++ 6 files changed, 181 insertions(+), 11 deletions(-) create mode 100644 src/test/erasure-code/TestJerasurePluginGeneric.cc create mode 100644 src/test/erasure-code/TestJerasurePluginSSE3.cc create mode 100644 src/test/erasure-code/TestJerasurePluginSSE4.cc diff --git a/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc b/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc index 2d35e92f094f9..6e2f16c116dab 100644 --- a/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc +++ b/src/erasure-code/jerasure/ErasureCodePluginSelectJerasure.cc @@ -36,6 +36,9 @@ public: stringstream ss; int ret; ceph_arch_probe(); + string name = "jerasure"; + if (parameters.count("jerasure-name")) + name = parameters.find("jerasure-name")->second; if (ceph_arch_intel_pclmul && ceph_arch_intel_sse42 && ceph_arch_intel_sse41 && @@ -43,15 +46,15 @@ public: ceph_arch_intel_sse3 && ceph_arch_intel_sse2) { dout(10) << "SSE4 plugin" << dendl; - ret = instance.factory("jerasure_sse4", parameters, erasure_code, ss); + ret = instance.factory(name + "_sse4", parameters, erasure_code, ss); } else if (ceph_arch_intel_ssse3 && ceph_arch_intel_sse3 && ceph_arch_intel_sse2) { dout(10) << "SSE3 plugin" << dendl; - ret = instance.factory("jerasure_sse3", parameters, erasure_code, ss); + ret = instance.factory(name + "_sse3", parameters, erasure_code, ss); } else { dout(10) << "generic plugin" << dendl; - ret = instance.factory("jerasure_generic", parameters, erasure_code, ss); + ret = instance.factory(name + "_generic", parameters, erasure_code, ss); } if (ret) derr << ss.str() << dendl; diff --git a/src/test/erasure-code/Makefile.am b/src/test/erasure-code/Makefile.am index 95065cf343c50..fdbe003f6cec9 100644 --- a/src/test/erasure-code/Makefile.am +++ b/src/test/erasure-code/Makefile.am @@ -52,6 +52,27 @@ libec_fail_to_register_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS) libec_fail_to_register_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*' erasure_codelib_LTLIBRARIES += libec_fail_to_register.la +libec_test_jerasure_sse4_la_SOURCES = test/erasure-code/TestJerasurePluginSSE4.cc +libec_test_jerasure_sse4_la_CFLAGS = ${AM_CFLAGS} +libec_test_jerasure_sse4_la_CXXFLAGS= ${AM_CXXFLAGS} +libec_test_jerasure_sse4_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS) +libec_test_jerasure_sse4_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*' +erasure_codelib_LTLIBRARIES += libec_test_jerasure_sse4.la + +libec_test_jerasure_sse3_la_SOURCES = test/erasure-code/TestJerasurePluginSSE3.cc +libec_test_jerasure_sse3_la_CFLAGS = ${AM_CFLAGS} +libec_test_jerasure_sse3_la_CXXFLAGS= ${AM_CXXFLAGS} +libec_test_jerasure_sse3_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS) +libec_test_jerasure_sse3_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*' +erasure_codelib_LTLIBRARIES += libec_test_jerasure_sse3.la + +libec_test_jerasure_generic_la_SOURCES = test/erasure-code/TestJerasurePluginGeneric.cc +libec_test_jerasure_generic_la_CFLAGS = ${AM_CFLAGS} +libec_test_jerasure_generic_la_CXXFLAGS= ${AM_CXXFLAGS} +libec_test_jerasure_generic_la_LIBADD = $(PTHREAD_LIBS) $(EXTRALIBS) +libec_test_jerasure_generic_la_LDFLAGS = ${AM_LDFLAGS} -export-symbols-regex '.*__erasure_code_.*' +erasure_codelib_LTLIBRARIES += libec_test_jerasure_generic.la + unittest_erasure_code_plugin_SOURCES = test/erasure-code/TestErasureCodePlugin.cc unittest_erasure_code_plugin_CXXFLAGS = $(UNITTEST_CXXFLAGS) unittest_erasure_code_plugin_LDADD = $(LIBOSD) $(LIBCOMMON) $(UNITTEST_LDADD) $(CEPH_GLOBAL) diff --git a/src/test/erasure-code/TestErasureCodePluginJerasure.cc b/src/test/erasure-code/TestErasureCodePluginJerasure.cc index 7dd33064b129a..0e0e31e27f63b 100644 --- a/src/test/erasure-code/TestErasureCodePluginJerasure.cc +++ b/src/test/erasure-code/TestErasureCodePluginJerasure.cc @@ -1,4 +1,4 @@ -// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab /* * Ceph - scalable distributed file system @@ -11,10 +11,12 @@ * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. - * + * */ #include +#include "arch/probe.h" +#include "arch/intel.h" #include "global/global_init.h" #include "erasure-code/ErasureCodePlugin.h" #include "common/ceph_argparse.h" @@ -30,7 +32,7 @@ TEST(ErasureCodePlugin, factory) ErasureCodeInterfaceRef erasure_code; EXPECT_FALSE(erasure_code); EXPECT_EQ(-ENOENT, instance.factory("jerasure", parameters, - &erasure_code, cerr)); + &erasure_code, cerr)); EXPECT_FALSE(erasure_code); } const char *techniques[] = { @@ -48,7 +50,83 @@ TEST(ErasureCodePlugin, factory) parameters["technique"] = *technique; EXPECT_FALSE(erasure_code); EXPECT_EQ(0, instance.factory("jerasure", parameters, - &erasure_code, cerr)); + &erasure_code, cerr)); + EXPECT_TRUE(erasure_code); + } +} + +TEST(ErasureCodePlugin, select) +{ + ceph_arch_probe(); + // save probe results + int arch_intel_pclmul = ceph_arch_intel_pclmul; + int arch_intel_sse42 = ceph_arch_intel_sse42; + int arch_intel_sse41 = ceph_arch_intel_sse41; + int arch_intel_ssse3 = ceph_arch_intel_ssse3; + int arch_intel_sse3 = ceph_arch_intel_sse3; + int arch_intel_sse2 = ceph_arch_intel_sse2; + + ErasureCodePluginRegistry &instance = ErasureCodePluginRegistry::instance(); + map parameters; + // load test plugins instead of actual plugins to assert the desired side effect + // happens + parameters["jerasure-name"] = "test_jerasure"; + parameters["directory"] = ".libs"; + parameters["technique"] = "reed_sol_van"; + + // all features are available, load the SSE4 plugin + { + ceph_arch_intel_pclmul = 1; + ceph_arch_intel_sse42 = 1; + ceph_arch_intel_sse41 = 1; + ceph_arch_intel_ssse3 = 1; + ceph_arch_intel_sse3 = 1; + ceph_arch_intel_sse2 = 1; + + ErasureCodeInterfaceRef erasure_code; + int sse4_side_effect = -444; + EXPECT_EQ(sse4_side_effect, instance.factory("jerasure", parameters, + &erasure_code, cerr)); + } + // pclmul is missing, load the SSE3 plugin + { + ceph_arch_intel_pclmul = 0; + ceph_arch_intel_sse42 = 1; + ceph_arch_intel_sse41 = 1; + ceph_arch_intel_ssse3 = 1; + ceph_arch_intel_sse3 = 1; + ceph_arch_intel_sse2 = 1; + + ErasureCodeInterfaceRef erasure_code; + int sse3_side_effect = -333; + EXPECT_EQ(sse3_side_effect, instance.factory("jerasure", parameters, + &erasure_code, cerr)); + } + // pclmul and sse3 are missing, load the generic plugin + { + ceph_arch_intel_pclmul = 0; + ceph_arch_intel_sse42 = 1; + ceph_arch_intel_sse41 = 1; + ceph_arch_intel_ssse3 = 1; + ceph_arch_intel_sse3 = 0; + ceph_arch_intel_sse2 = 1; + + ErasureCodeInterfaceRef erasure_code; + int generic_side_effect = -111; + EXPECT_EQ(generic_side_effect, instance.factory("jerasure", parameters, + &erasure_code, cerr)); + } + + + // restore probe results + ceph_arch_intel_pclmul = arch_intel_pclmul; + ceph_arch_intel_sse42 = arch_intel_sse42; + ceph_arch_intel_sse41 = arch_intel_sse41; + ceph_arch_intel_ssse3 = arch_intel_ssse3; + ceph_arch_intel_sse3 = arch_intel_sse3; + ceph_arch_intel_sse2 = arch_intel_sse2; +} + EXPECT_TRUE(erasure_code); } } @@ -65,12 +143,11 @@ int main(int argc, char **argv) return RUN_ALL_TESTS(); } -/* +/* * Local Variables: - * compile-command: "cd ../.. ; make -j4 && - * make unittest_erasure_code_plugin_jerasure && + * compile-command: "cd ../.. ; make -j4 && + * make unittest_erasure_code_plugin_jerasure && * valgrind --tool=memcheck ./unittest_erasure_code_plugin_jerasure \ * --gtest_filter=*.* --log-to-stderr=true --debug-osd=20" * End: */ - diff --git a/src/test/erasure-code/TestJerasurePluginGeneric.cc b/src/test/erasure-code/TestJerasurePluginGeneric.cc new file mode 100644 index 0000000000000..f273bd67925d1 --- /dev/null +++ b/src/test/erasure-code/TestJerasurePluginGeneric.cc @@ -0,0 +1,23 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2014 Cloudwatt + * + * Author: Loic Dachary + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + */ + +#include +#include "erasure-code/ErasureCodePlugin.h" + +int __erasure_code_init(char *plugin_name) +{ + return -111; +} diff --git a/src/test/erasure-code/TestJerasurePluginSSE3.cc b/src/test/erasure-code/TestJerasurePluginSSE3.cc new file mode 100644 index 0000000000000..9d74d52ce406b --- /dev/null +++ b/src/test/erasure-code/TestJerasurePluginSSE3.cc @@ -0,0 +1,23 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2014 Cloudwatt + * + * Author: Loic Dachary + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + */ + +#include +#include "erasure-code/ErasureCodePlugin.h" + +int __erasure_code_init(char *plugin_name) +{ + return -333; +} diff --git a/src/test/erasure-code/TestJerasurePluginSSE4.cc b/src/test/erasure-code/TestJerasurePluginSSE4.cc new file mode 100644 index 0000000000000..7bb6f7e6bdccc --- /dev/null +++ b/src/test/erasure-code/TestJerasurePluginSSE4.cc @@ -0,0 +1,23 @@ +// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- +// vim: ts=8 sw=2 smarttab +/* + * Ceph - scalable distributed file system + * + * Copyright (C) 2014 Cloudwatt + * + * Author: Loic Dachary + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + */ + +#include +#include "erasure-code/ErasureCodePlugin.h" + +int __erasure_code_init(char *plugin_name) +{ + return -444; +} -- 2.39.5