get rid of builtin_popcount to please ppc

Signed-off-by: raver119 <raver119@gmail.com>
master
raver119 2019-09-01 19:57:39 +03:00
parent 3679e55c49
commit 00cf28f477
1 changed files with 15 additions and 3 deletions

View File

@ -24,6 +24,18 @@
namespace nd4j {
namespace ops {
namespace helpers {
static Nd4jLong hamming_distance(unsigned long long x, unsigned long long y) {
Nd4jLong dist = 0;
for (unsigned long long val = x ^ y; val > 0; val /= 2) {
if (val & 1)
dist++;
}
return dist;
}
template <typename X, typename Z>
static void _hamming(NDArray &x, NDArray &y, NDArray &z) {
auto xEws = x.ews();
@ -47,7 +59,7 @@ namespace nd4j {
auto _x = static_cast<unsigned long long>(xBuffer[e]);
auto _y = static_cast<unsigned long long>(yBuffer[e]);
intermediate[omp_get_thread_num()] += __builtin_popcountll(_x ^ _y);
intermediate[omp_get_thread_num()] += hamming_distance(_x ^ _y);
}
} else if (xEws > 1 && yEws > 1 && x.ordering() == y.ordering()) {
@ -56,7 +68,7 @@ namespace nd4j {
auto _x = static_cast<unsigned long long>(xBuffer[e * xEws]);
auto _y = static_cast<unsigned long long>(yBuffer[e * yEws]);
intermediate[omp_get_thread_num()] += __builtin_popcountll(_x ^ _y);
intermediate[omp_get_thread_num()] += hamming_distance(_x ^ _y);
}
} else {
PRAGMA_OMP_PARALLEL_FOR
@ -64,7 +76,7 @@ namespace nd4j {
auto _x = static_cast<unsigned long long>(x.e<Nd4jLong>(e));
auto _y = static_cast<unsigned long long>(y.e<Nd4jLong>(e));
intermediate[omp_get_thread_num()] += __builtin_popcountll(_x ^ _y);
intermediate[omp_get_thread_num()] += hamming_distance(_x ^ _y);
}
}