catid / cm256 Goto Github PK
View Code? Open in Web Editor NEWFast GF(256) Cauchy MDS Block Erasure Codec in C
Fast GF(256) Cauchy MDS Block Erasure Codec in C
When building with old cmake - I have following error:
fippo@nanopim4:~/koding/cm256/build$ cmake ..
-- The C compiler identification is GNU 8.3.0
-- The CXX compiler identification is GNU 8.3.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:47 (install):
install TARGETS given no ARCHIVE DESTINATION for static library target
"cm256".
-- Configuring incomplete, errors occurred!
See also "/home/fippo/koding/cm256/build/CMakeFiles/CMakeOutput.log".
fippo@nanopim4:~/koding/cm256/build$ cmake --version
cmake version 3.13.4
update fg256.h from catid/gf256#6
HI, I am trying to run this program at android platform.
extern "C" void gf256_add_mem(void * GF256_RESTRICT vx,
const void * GF256_RESTRICT vy, int bytes)
{
GF256_M128 * GF256_RESTRICT x16 = reinterpret_cast<GF256_M128 *>(vx);
const GF256_M128 * GF256_RESTRICT y16 = reinterpret_cast<const GF256_M128 *>(vy);
#if defined(GF256_TARGET_MOBILE)
# if defined(GF256_TRY_NEON)
// Handle multiples of 64 bytes
if (CpuHasNeon)
{
while (bytes >= 64)
{
GF256_M128 x0 = vld1q_u8((uint8_t*) x16);
GF256_M128 x1 = vld1q_u8((uint8_t*)(x16 + 1) );
GF256_M128 x2 = vld1q_u8((uint8_t*)(x16 + 2) );
GF256_M128 x3 = vld1q_u8((uint8_t*)(x16 + 3) );
GF256_M128 y0 = vld1q_u8((uint8_t*)y16);
GF256_M128 y1 = vld1q_u8((uint8_t*)(y16 + 1));
GF256_M128 y2 = vld1q_u8((uint8_t*)(y16 + 2));
GF256_M128 y3 = vld1q_u8((uint8_t*)(y16 + 3));
vst1q_u8((uint8_t*)x16, veorq_u8(x0, y0));
vst1q_u8((uint8_t*)(x16 + 1), veorq_u8(x1, y1));
vst1q_u8((uint8_t*)(x16 + 2), veorq_u8(x2, y2));
vst1q_u8((uint8_t*)(x16 + 3), veorq_u8(x3, y3));
bytes -= 64, x16 += 4, y16 += 4;
}
// Handle multiples of 16 bytes
while (bytes >= 16)
{
GF256_M128 x0 = vld1q_u8((uint8_t*)x16);
GF256_M128 y0 = vld1q_u8((uint8_t*)y16);
vst1q_u8((uint8_t*)x16, veorq_u8(x0, y0));
bytes -= 16, ++x16, ++y16;
}
}
else
# endif // GF256_TRY_NEON
{
uint64_t * GF256_RESTRICT x8 = reinterpret_cast<uint64_t *>(x16);
const uint64_t * GF256_RESTRICT y8 = reinterpret_cast<const uint64_t *>(y16);
const unsigned count = (unsigned)bytes / 8;
for (unsigned ii = 0; ii < count; ++ii)
x8[ii] ^= y8[ii];
x16 = reinterpret_cast<GF256_M128 *>(x8 + count);
y16 = reinterpret_cast<const GF256_M128 *>(y8 + count);
bytes -= (count * 8);
}
#else // GF256_TARGET_MOBILE
# if defined(GF256_TRY_AVX2)
if (CpuHasAVX2)
{
GF256_M256 * GF256_RESTRICT x32 = reinterpret_cast<GF256_M256 *>(x16);
const GF256_M256 * GF256_RESTRICT y32 = reinterpret_cast<const GF256_M256 *>(y16);
while (bytes >= 128)
{
GF256_M256 x0 = _mm256_loadu_si256(x32);
GF256_M256 y0 = _mm256_loadu_si256(y32);
x0 = _mm256_xor_si256(x0, y0);
GF256_M256 x1 = _mm256_loadu_si256(x32 + 1);
GF256_M256 y1 = _mm256_loadu_si256(y32 + 1);
x1 = _mm256_xor_si256(x1, y1);
GF256_M256 x2 = _mm256_loadu_si256(x32 + 2);
GF256_M256 y2 = _mm256_loadu_si256(y32 + 2);
x2 = _mm256_xor_si256(x2, y2);
GF256_M256 x3 = _mm256_loadu_si256(x32 + 3);
GF256_M256 y3 = _mm256_loadu_si256(y32 + 3);
x3 = _mm256_xor_si256(x3, y3);
_mm256_storeu_si256(x32, x0);
_mm256_storeu_si256(x32 + 1, x1);
_mm256_storeu_si256(x32 + 2, x2);
_mm256_storeu_si256(x32 + 3, x3);
bytes -= 128, x32 += 4, y32 += 4;
}
// Handle multiples of 32 bytes
while (bytes >= 32)
{
// x[i] = x[i] xor y[i]
_mm256_storeu_si256(x32,
_mm256_xor_si256(
_mm256_loadu_si256(x32),
_mm256_loadu_si256(y32)));
bytes -= 32, ++x32, ++y32;
}
x16 = reinterpret_cast<GF256_M128 *>(x32);
y16 = reinterpret_cast<const GF256_M128 *>(y32);
}
else
# endif // GF256_TRY_AVX2
{
while (bytes >= 64)
{
GF256_M128 x0 = _mm_loadu_si128(x16);
GF256_M128 y0 = _mm_loadu_si128(y16);
x0 = _mm_xor_si128(x0, y0);
GF256_M128 x1 = _mm_loadu_si128(x16 + 1);
GF256_M128 y1 = _mm_loadu_si128(y16 + 1);
x1 = _mm_xor_si128(x1, y1);
GF256_M128 x2 = _mm_loadu_si128(x16 + 2);
GF256_M128 y2 = _mm_loadu_si128(y16 + 2);
x2 = _mm_xor_si128(x2, y2);
GF256_M128 x3 = _mm_loadu_si128(x16 + 3);
GF256_M128 y3 = _mm_loadu_si128(y16 + 3);
x3 = _mm_xor_si128(x3, y3);
_mm_storeu_si128(x16, x0);
_mm_storeu_si128(x16 + 1, x1);
_mm_storeu_si128(x16 + 2, x2);
_mm_storeu_si128(x16 + 3, x3);
bytes -= 64, x16 += 4, y16 += 4;
}
}
#endif // GF256_TARGET_MOBILE
#if !defined(GF256_TARGET_MOBILE)
// Handle multiples of 16 bytes
while (bytes >= 16)
{
// x[i] = x[i] xor y[i]
_mm_storeu_si128(x16,
_mm_xor_si128(
_mm_loadu_si128(x16),
_mm_loadu_si128(y16)));
bytes -= 16, ++x16, ++y16;
}
#endif
uint8_t * GF256_RESTRICT x1 = reinterpret_cast<uint8_t *>(x16);
const uint8_t * GF256_RESTRICT y1 = reinterpret_cast<const uint8_t *>(y16);
// Handle a block of 8 bytes
const int eight = bytes & 8;
if (eight)
{
uint64_t * GF256_RESTRICT x8 = reinterpret_cast<uint64_t *>(x1);
const uint64_t * GF256_RESTRICT y8 = reinterpret_cast<const uint64_t *>(y1);
*x8 ^= *y8;
}
// Handle a block of 4 bytes
const int four = bytes & 4;
if (four)
{
uint32_t * GF256_RESTRICT x4 = reinterpret_cast<uint32_t *>(x1 + eight);
const uint32_t * GF256_RESTRICT y4 = reinterpret_cast<const uint32_t *>(y1 + eight);
*x4 ^= *y4;
}
// Handle final bytes
const int offset = eight + four;
switch (bytes & 3)
{
case 3: x1[offset + 2] ^= y1[offset + 2];
case 2: x1[offset + 1] ^= y1[offset + 1];
case 1: x1[offset] ^= y1[offset];
default:
break;
}
}
we have define GF256_TARGET_MOBILE and GF256_TRY_NEON, and CpuHasNeon is true.
// Handle a block of 8 bytes
const int eight = bytes & 8;
if (eight)
{
uint64_t * GF256_RESTRICT x8 = reinterpret_cast<uint64_t *>(x1);
const uint64_t * GF256_RESTRICT y8 = reinterpret_cast<const uint64_t *>(y1);
*x8 ^= *y8;
}
*x8^=*y8 cause sigbus illegal alignment error. is there some compile arguments must be set?
thanks very much.
Dear Catid,
Recently I've tried to build this project on the latest version of VS 2015. I've noted that in your readme, you've stated that this project only works on the 2013 edition.
I was just wondering if this still works in general since the tests that I tried running in main (in the unit tests folder, disabling the performance tests leaving only the example file usage and the check memswap) failed.
Note that I have not changed anything at all in the source apart from disabling the compilation of the performance tests.
This is the result of the debug output in VS
'matrix_test.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Cannot find or open the PDB file.
'matrix_test.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Cannot find or open the PDB file.
'matrix_test.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Cannot find or open the PDB file.
'matrix_test.exe' (Win32): Loaded 'C:\Windows\SysWOW64\apphelp.dll'. Cannot find or open the PDB file.
The program '[9996] matrix_test.exe' has exited with code 3 (0x3).
Apologies if this is the wrong place to ask this, I'm new to programming in VS.
Sincerely,
TritonJak
fippo@ubuntu:~$ uname -a
Linux ubuntu 5.8.0-43-generic #49~20.04.1-Ubuntu SMP Fri Feb 5 09:57:56 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
fippo@mainserver:~/cm_debug/build$ make
Scanning dependencies of target cm_debug
[ 20%] Building CXX object CMakeFiles/cm_debug.dir/main.cpp.o
[ 40%] Building CXX object CMakeFiles/cm_debug.dir/cm256.cpp.o
[ 60%] Building CXX object CMakeFiles/cm_debug.dir/gf256.cpp.o
In file included from /home/fippo/cm_debug/gf256.h:75:0,
from /home/fippo/cm_debug/gf256.cpp:30:
/usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h: In function ‘void gf256_mul_mem(void*, const void*, uint8_t, int)’:
/usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h:136:1: error: inlining failed in call to always_inline ‘__m128i _mm_shuffle_epi8(__m128i, __m128i)’: target specific option mismatch
_mm_shuffle_epi8 (__m128i __X, __m128i __Y)
^
/home/fippo/cm_debug/gf256.cpp:1197:50: error: called from here
h0 = _mm_shuffle_epi8(table_hi_y, h0);
^
In file included from /home/fippo/cm_debug/gf256.h:75:0,
from /home/fippo/cm_debug/gf256.cpp:30:
/usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h:136:1: error: inlining failed in call to always_inline ‘__m128i _mm_shuffle_epi8(__m128i, __m128i)’: target specific option mismatch
_mm_shuffle_epi8 (__m128i __X, __m128i __Y)
^
/home/fippo/cm_debug/gf256.cpp:1196:50: error: called from here
l0 = _mm_shuffle_epi8(table_lo_y, l0);
^
In file included from /home/fippo/cm_debug/gf256.h:75:0,
from /home/fippo/cm_debug/gf256.cpp:30:
/usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h:136:1: error: inlining failed in call to always_inline ‘__m128i _mm_shuffle_epi8(__m128i, __m128i)’: target specific option mismatch
_mm_shuffle_epi8 (__m128i __X, __m128i __Y)
^
/home/fippo/cm_debug/gf256.cpp:1197:50: error: called from here
h0 = _mm_shuffle_epi8(table_hi_y, h0);
^
In file included from /home/fippo/cm_debug/gf256.h:75:0,
from /home/fippo/cm_debug/gf256.cpp:30:
/usr/lib/gcc/x86_64-linux-gnu/5/include/tmmintrin.h:136:1: error: inlining failed in call to always_inline ‘__m128i _mm_shuffle_epi8(__m128i, __m128i)’: target specific option mismatch
_mm_shuffle_epi8 (__m128i __X, __m128i __Y)
^
/home/fippo/cm_debug/gf256.cpp:1196:50: error: called from here
l0 = _mm_shuffle_epi8(table_lo_y, l0);
^
CMakeFiles/cm_debug.dir/build.make:110: recipe for target 'CMakeFiles/cm_debug.dir/gf256.cpp.o' failed
make[2]: *** [CMakeFiles/cm_debug.dir/gf256.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/cm_debug.dir/all' failed
make[1]: *** [CMakeFiles/cm_debug.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
I suggest to add travis.ci or any other CI system to check builds.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.