Commit Graph

204 Commits (2700e1b9ae066215b7ccb780078b32da88c9716c)

Author SHA1 Message Date
Brad Hubbard 2700e1b9ae Resolve cppcheck Signed integer overflow errors
The type of expression '1<<31' is signed int and this causes cppcheck to
issue the following warning.

src/gf_w32.c:681]: (error) Signed integer overflow for expression
'1<<31'.

Signed-off-by: Brad Hubbard <bhubbard@redhat.com>
2017-04-10 17:21:30 +10:00
Loic Dachary ea75cdffe1 Merge branch 'wip-18092' into 'master'
gf_cpu.c: fix pclmul detection and add portable cpuid feature bit defs

See merge request !20
2016-12-08 06:12:42 +00:00
John Coyle 7c2fcc5bd0 gf_cpu.c: fix pclmul detection and add portable cpuid feature bit defs
Correct invalid check for pclmul support. Was checking SSE3 (1 << 0) vs. PCLMUL (1 << 1).

Fixes: http://tracker.ceph.com/issues/18092
Signed-off-by: John Coyle <dx9err@gmail.com>
2016-12-07 21:50:17 -05:00
Loic Dachary c431e1ff76 Merge branch 'gf32-mul-silence-warning' into 'master'
Gf32 mul silence warning

silence warning like

```
/slow/kchai/ceph/src/erasure-code/jerasure/gf-complete/src/gf_w32.c: In function ‘gf_w32_cfmgk_multiply_region_from_single’:
/slow/kchai/ceph/src/erasure-code/jerasure/gf-complete/src/gf_w32.c:410:5: warning: ‘a’ may be used uninitialized in this function [-Wmaybe-uninitialized]
   g = _mm_insert_epi64 (a, g_star, 0);
     ^
```

See merge request !19
2016-11-23 06:51:02 +00:00
Kefu Chai 9fbc442593 gf_w32.c: silence the -Wmaybe-uninitialized warning
in gf_w32_cfmgk_multiply_region_from_single(), follow warning is
reported by gcc:

gf-complete/src/gf_w32.c:410:5: warning: ‘a’ may be used uninitialized
in this function [-Wmaybe-uninitialized]
   g = _mm_insert_epi64 (a, g_star, 0);
     ^

actually, we are using `a` as a dummy parameter for initializing `g` and
`q`. and only the lower lower 64 bits of them are used when doing
calculation. but their lower 64 bits are always initialized using
_mm_insert_epi64(). so this is a false alarm.

but we can silence this warning by moving the statement initializing `a`
up before passing it to  _mm_insert_epi64(). this change does not hurt
the performance.

Signed-off-by: Kefu Chai <kchai@redhat.com>
2016-11-18 03:53:50 +00:00
bassamtabbara a6847973cb Merge branch 'simd-runtime-detection' into 'master'
Support for runtime detection of SIMD

This merge request adds support for runtime SIMD detection. The idea is that you would build gf-complete with full SIMD support, and gf_init will select the appropriate function at runtime based on the capabilities of the target machine. This would eliminate the need to build different versions of the code for different processors (you still need to build for different archs). Ceph for example has 3-4 flavors of jerasure on Intel (and does not support PCLMUL optimizations as a result of using to many binaries). Numerous libraries have followed as similar approach include zlib.

When reviewing this merge request I recommend that you look at each of the 5 commits independently. The first 3 commits don't change the existing logic. Instead they add debugging functions and test scripts that facilitate testing of the 4th and commit. The 4th commit is where all the new logic goes along with tests. The 5th commit fixes build scripts.

I've tested this on x86_64, arm, and aarch64 using QEMU. Numerous tests have been added that help this code and could help with future testing of gf-complete. Also I've compared the functions selected with the old code (prior to runtime SIMD support) with the new code and all functions are identical. Here's a gist with the test results prior to SIMD extensions: https://gist.github.com/bassamtabbara/d9a6dcf0a749b7ab01bc2953a359edec.

See merge request !18
2016-09-14 20:22:27 +00:00
Bassam Tabbara 0690ba86a8 Added --enable flags for debugging runtime SIMD 2016-09-13 12:25:00 -07:00
Bassam Tabbara 0e5c920fb6 gf_multby_one now checks runtime SIMD support 2016-09-13 12:25:00 -07:00
Bassam Tabbara ad11042132 Simplify SIMD make scripts
ax_ext.m4 no longer performs any CPU checks. Instead it just checks
if the the compile supports SIMD flags.

Runtime detection will choose the right methods base on CPU
instructions available.

Intel AVX support is still done through the build since it would
require a major refactoring of the code base to support it at runtime.
For now I added a configuration flag --enable-avx that can be used
to compile with AVX support.

Also use cpu intrinsics instead of __asm__
2016-09-13 12:25:00 -07:00
Bassam Tabbara 4339569f14 Support for runtime SIMD detection
This commits adds support for runtime detection of SIMD instructions. The idea is that you would build once with all supported SIMD functions and the same binaries could run on different machines with varying support for SIMD. At runtime gf-complete will select the right functions based on the processor.

gf_cpu.c has the logic to detect SIMD instructions. On Intel processors this is done through cpuid. For ARM on linux we use getauxv.

The logic in gf_w*.c has been changed to check for runtime SIMD support and fallback to generic code.

Also a new test has been added. It compares the functions selected by gf_init when we enable/disable SIMD support through build flags, with runtime enabling/disabling. The test checks if the results are identical.
2016-09-13 12:24:25 -07:00
Bassam Tabbara 7761438c63 Add SIMD test helpers
This commit adds a couple of scripts that help test SIMD functionality
on different machines through QEMU.

tools/test_simd_qemu.sh will automatically start qemu, run tests
and stop it. it uses the Ubuntu cloud images which are built for
x86_64, arm and arm64.

tools/test_simd.sh run a number of tests including compiling
with different flags, unit tests, and gathering the functions
selected in gf_init (and when compiling with DEBUG_FUNCTIONS)
2016-09-13 12:24:25 -07:00
Bassam Tabbara 87f0d4395d Add support for printing functions selected in gf_init
There is currently no way to figure out which functions were selected
during gf_init and as a result of SIMD options. This is not even possible
in gdb since most functions are static.

This commit adds a new macro SET_FUNCTION that records the name of the
function selected during init inside the gf_internal structure. This macro
only works when DEBUG_FUNCTIONS is defined during compile. Otherwise the
code works exactly as it did before this change.

The names of selected functions will be used during testing of SIMD
runtime detection.

All calls such as:

gf->multiply.w32 = gf_w16_shift_multiply;

need to be replaced with the following:

SET_FUNCTION(gf,multiply,w32,gf_w16_shift_multiply)

Also added a new flag to tools/gf_methods that will print the names of
functions selected during gf_init.
2016-09-13 12:24:25 -07:00
Bassam Tabbara 22352ca094 Remove generated autotools files from the build. Also update
.gitignore to ignore some autotools files and tests.
2016-09-13 12:24:25 -07:00
Loic Dachary 185295f247 Merge branch 'wip-valgrind' into 'master'
enable valgrind for tests

See merge request !9
2016-09-13 19:23:39 +00:00
Loic Dachary 51a1abb918 Merge branch 'neon_fixes' into 'master'
NEON fixes/tweaks

This merge request fixes some issues and adds some tweaks to NEON code:

* SPLIT(16,4) ALTMAP implementation was broken as it only processed half the amount of data. As such, this fixed implementation is significantly slower than the old code (which is to be expected). Fixes #2
* SPLIT(16,4) implementations now merge the ARMv8 and older code path, similar to SPLIT(32,4). This fixes the ALTMAP variant, and also enables the non-ALTMAP version to have consistent sizing
* Unnecessary VTRN removed in non-ALTMAP SPLIT(16,4) as NEON allows (de)interleaving during load/store; because of this, ALTMAP isn't so useful in NEON
  * This can also be done for SPLIT(32,4), but I have not implemented it
* I also pulled the `if(xor)` conditional from non-ALTMAP SPLIT(16,4) to outside the loop. It seems to improve performance a bit on my Cortex A7
  * It probably should be implemented everywhere else, but I have not done this
* CARRY_FREE was incorrectly enabled on all sizes of w, when it's only available for w=4 and w=8

See merge request !16
2016-09-13 10:34:23 +00:00
Loic Dachary f940bf3b5b log-zero-ext: workaround for uninitialized memory
Workaround until issue #13 is dealt with.

Signed-off-by: Loic Dachary <loic@dachary.org>
2016-09-13 11:46:05 +02:00
Loic Dachary e2dd917ea1 increase the verbosity of make check failures
Signed-off-by: Loic Dachary <loic@dachary.org>
2016-09-13 10:25:13 +02:00
Loic Dachary 22cd7b15e8 add --enable-valgrind for make check
If --enable-valgrind is given to ./configure, all tests are run with
valgrind set to fail if an error is reported ( --error-exitcode=1 )

Signed-off-by: Loic Dachary <loic@dachary.org>
2016-09-13 10:09:00 +02:00
Loic Dachary 62b702d568 do not memcpy if src and dst are the same
This is harmless really but triggers a valgrind error.

Signed-off-by: Loic Dachary <loic@dachary.org>
2016-09-13 09:48:18 +02:00
Loic Dachary 8fe7382e2a Merge branch 'manual' into 'master'
HTML manual fixes

Fixes to HTML manual, for mistakes I've noticed.
I'm sure there's more, but this is a start...

See merge request !14
2016-09-13 06:59:08 +00:00
animetosho 643743d048 Move conditional outside loop for NEON SPLIT4 implementation
Seems to improve performance a fair bit
2015-11-14 16:32:25 +10:00
animetosho 05057e5635 Eliminate unnecessary VTRNs in SPLIT(16,4) NEON implementation
Also makes the ARMv8 version consistent with the older one, in terms of processing width
2015-11-12 22:17:53 +10:00
animetosho 438283c12d Use similar strategy for SPLIT(16,4) ALTMAP NEON implementation as SPLIT(32,4) 2015-11-12 21:17:13 +10:00
animetosho f373b138aa Initial fix for SPLIT(16,4) ALTMAP NEON (non ARMv8) 2015-11-12 21:09:44 +10:00
animetosho 7a9a09f32c CARRY_FREE is currently only available for w=4 and w=8 on NEON 2015-11-12 21:06:34 +10:00
animetosho 9f9f005a3f Fix a number of conversion issues in the HTML manual 2015-11-02 18:19:12 +10:00
KMG 363da20723 Merge branch 'wip-manual' into 'master'
convert manual from PDF to HTML

See merge request !11
2015-09-04 01:23:27 +00:00
Loic Dachary d1b6bbf706 add -Wsign-compare and address the warnings
* (1 << w) are changed into ((uint32_t)1 << w)
* int are changed into uint32_t

gf.c: gf_composite_get_default_poly:

   a larger unsigned were assigned to unsigned integers in which case
   the type of the assigned variable is changed to be the same as the
   value assigned to it.

gf_w16.c: GF_MULTBY_TWO

   setting the parameter to a variable instead of passing the expression
   resolves the warning for some reason.

Signed-off-by: Loic Dachary <loic@dachary.org>
2015-09-02 19:20:33 +02:00
Loic Dachary 284a97a0d9 ignore test-driver file
Ignore it because it is rebuild by autogen.sh

Signed-off-by: Loic Dachary <loic@dachary.org>
2015-09-02 19:02:40 +02:00
Loic Dachary af22f913ed Merge branch 'wip-da-SCA-coverity' into 'master'
Fix issues found by Coverity in the Ceph project

Remove dead code and fix potential integer overflow issues

See merge request !12
2015-09-02 16:05:33 +00:00
Danny Al-Gaaf 2f6db512fb gf_w64.c: fix integer overflow
Fix for Coverity issue (from Ceph):

CID 1193089 (#1 of 1): Unintentional integer overflow (OVERFLOW_BEFORE_WIDEN)
 overflow_before_widen: Potentially overflowing expression 1 << g_r with type
 int (32 bits, signed) is evaluated using 32-bit arithmetic, and then used in
 a context that expects an expression of type uint64_t (64 bits, unsigned).

CID 1193090 (#1 of 1): Unintentional integer overflow (OVERFLOW_BEFORE_WIDEN)
 overflow_before_widen: Potentially overflowing expression 1 << g_s with type
 int (32 bits, signed) is evaluated using 32-bit arithmetic, and then used in
 a context that expects an expression of type uint64_t (64 bits, unsigned).

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
2015-06-18 09:01:37 +02:00
Danny Al-Gaaf 1aef8694bc gf_w64.c: fix integer overflow
Fix for Coverity issue (from Ceph):

CID 1193088 (#1 of 1): Unintentional integer overflow (OVERFLOW_BEFORE_WIDEN)
 overflow_before_widen: Potentially overflowing expression 1 << g_s with type
 int (32 bits, signed) is evaluated using 32-bit arithmetic, and then used in
 a context that expects an expression of type uint64_t (64 bits, unsigned).

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
2015-06-18 09:00:03 +02:00
Danny Al-Gaaf e127bb1fb9 gf_w64.c: fix integer overflow
Fix for Coverity issue (from Ceph):

CID 1193087 (#1 of 1): Unintentional integer overflow (OVERFLOW_BEFORE_WIDEN)
 overflow_before_widen: Potentially overflowing expression 1 << g_r with type
  int (32 bits, signed) is evaluated using 32-bit arithmetic, and then used
  in a context that expects an expression of type uint64_t (64 bits, unsigned).

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
2015-06-18 08:58:20 +02:00
Danny Al-Gaaf 98e5e37159 gf_w64.c: fix integer overflow
Fix for Coverity issue (from Ceph):

CID 1193086 (#1 of 1): Unintentional integer overflow (OVERFLOW_BEFORE_WIDEN)
 overflow_before_widen: Potentially overflowing expression 1 << g_r with type
  int (32 bits, signed) is evaluated using 32-bit arithmetic, and then used in
  a context that expects an expression of type uint64_t (64 bits, unsigned).

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
2015-06-18 08:55:49 +02:00
Danny Al-Gaaf 7972291e1f src/gf_w128.c: remove dead code and unused variable
Fix for Coverity issue:

CID 1297812 (#1 of 1): Constant variable guards dead code (DEADCODE)
 dead_error_begin: Execution cannot reach this statement: fprintf(stderr,
  "Code conta....
 Local variable no_default_flag is assigned only once, to a constant
  value, making it effectively constant throughout its scope. If this
  is not the intent, examine the logic to see if there is a missing
  assignment that would make no_default_flag not remain constant.

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
2015-06-17 10:46:44 +02:00
Danny Al-Gaaf da671b4908 src/gf_w64.c: remove dead code
Fix for Coverity issue:

CID 1297852 (#1 of 1): 'Constant'; variable guards dead code (DEADCODE)
 dead_error_begin: Execution cannot reach this statement:
  fprintf(stderr, "Code conta....
 Local variable no_default_flag is assigned only once, to a constant value,
  making it effectively constant throughout its scope. If this is not the
  intent, examine the logic to see if there is a missing assignment that
  would make no_default_flag not remain constant.

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
2015-06-17 10:46:21 +02:00
Loic Dachary 547f67ec98 manual: convert from PDF to HTML
It makes it easier to update.

Signed-off-by: Loic Dachary <loic@dachary.org>
2015-01-14 16:15:27 +01:00
KMG 5f31e2719d Merge branch 'wip-documentation' into 'master'
jerasure.org is http, not https

See merge request !4
2015-01-08 14:59:07 +00:00
Loic Dachary 15ce8650c7 jerasure.org is http, not https
Signed-off-by: Loic Dachary <loic@dachary.org>
2014-12-29 15:16:31 +01:00
KMG dd5389542e Merge branch 'wip-dirstamp-ignore' into 'master'
dirstamp ignore

See merge request !1
2014-12-29 03:27:23 +00:00
KMG 9a652166c4 Merge branch 'wip-exit-v2' into 'master'
exit v2

See merge request !2
2014-12-29 03:27:02 +00:00
KMG 695d83ea59 Merge branch 'wip-documentation' into 'master'
documentation

updates to replace URLs that do not contain useful information

See merge request !3
2014-12-29 03:26:44 +00:00
Loic Dachary 58eebabd20 documentation: update with jerasure.org new home
Signed-off-by: Loic Dachary <loic@dachary.org>
2014-12-25 11:55:49 +01:00
Loic Dachary cbbf35b6d2 Revert "Removed PDF from the repo and added a note in the README that describes how to"
This reverts commit 9311b4fc10.
2014-12-25 11:51:38 +01:00
Greg Farnum 79f34a1b46 gitignore: add src/.dirstamp
Signed-off-by: Greg Farnum <gfarnum@redhat.com>
2014-12-25 00:56:32 +01:00
Loic Dachary e7131cfd85 use assert(0) instead of exit(1)
When a fatal error (unaligned memory etc.) is detected, gf-complete should
assert(3) instead of exit(3) to give a chance to the calling program to
catch the exception and display a stack trace. Although it is possible
for gdb to display the stack trace and break on exit, libraries are not
usually expected to terminate the calling program in this way.

Signed-off-by: Loic Dachary <loic@dachary.org>
(cherry picked from commit 29427efac2)
2014-12-15 13:47:47 +01:00
kmgreen2 e0e400aaf6 Merge pull request #1 from dachary/wip-assert
use assert(0) instead of exit(1)
2014-12-06 08:09:55 -08:00
Loic Dachary 29427efac2 use assert(0) instead of exit(1)
When a fatal error (unaligned memory etc.) is detected, gf-complete should
assert(3) instead of exit(3) to give a chance to the calling program to
catch the exception and display a stack trace. Although it is possible
for gdb to display the stack trace and break on exit, libraries are not
usually expected to terminate the calling program in this way.

Signed-off-by: Loic Dachary <loic@dachary.org>
2014-12-02 00:27:27 +01:00
Kevin Greenan 70dd94ae38 Merged in jannau/gf-complete/neon (pull request #25)
arm neon optimisations
2014-10-24 14:19:31 -07:00
Janne Grunau 6fdd8bc3d3 arm: NEON optimisations for gf_w64
Optimisations for 4,64 split table region multiplications. Only used on
ARMv8-A since it is not faster on ARMv7-A.
2014-10-24 14:54:55 +02:00