diff --git a/.gitignore b/.gitignore index 04e9646d..21752902 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ tmp/ *.dylib *.o *.a +*.lo #================================================================================ # from https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore diff --git a/src/main/java/com/intel/gkl/ftz/FTZ.java b/src/main/java/com/intel/gkl/ftz/FTZ.java new file mode 100644 index 00000000..57f115e1 --- /dev/null +++ b/src/main/java/com/intel/gkl/ftz/FTZ.java @@ -0,0 +1,42 @@ +package com.intel.gkl.ftz; + +import com.intel.gkl.IntelGKLUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.File; + +public class FTZ { + private final static Logger logger = LogManager.getLogger(FTZ.class); + + private boolean isGklLoaded; + + public FTZ() { + this(null); + } + + public FTZ(File tmpDir) { + isGklLoaded = IntelGKLUtils.load(tmpDir); + + if (!isGklLoaded) { + logger.warn("FTZ control is not supported on this platform."); + } + } + + public boolean isSupported() { + return isGklLoaded; + } + + public boolean getFlushToZero() { + return isGklLoaded && getFlushToZeroNative(); + } + + public void setFlushToZero(boolean value) { + if (isGklLoaded) { + setFlushToZeroNative(value); + } + } + + private native boolean getFlushToZeroNative(); + private native void setFlushToZeroNative(boolean value); +} diff --git a/src/main/native/build b/src/main/native/build index 2065a26b..b2229728 100755 --- a/src/main/native/build +++ b/src/main/native/build @@ -6,6 +6,10 @@ ZLIB=$COMPRESSION/otc_zlib #ZLIB=$COMPRESSION/zlib-1.2.8 PAIRHMM=pairhmm +cd ftz +make +cd - + cd pairhmm make cd - @@ -25,14 +29,16 @@ if [[ $os == "Linux" ]]; then g++ -z noexecstack -shared -fPIC -O3 -static-libgcc -static-libstdc++ \ $COMPRESSION/IntelDeflater.o $IGZIP/lib/libisal.a $ZLIB/libz.a \ $PAIRHMM/IntelPairHmm.o \ + ftz/ftz.o \ -o libIntelGKL.so elif [[ $os == "Darwin" ]]; then g++ -shared -fPIC -O3 \ - $COMPRESSION/IntelDeflater.o $IGZIP/igzip/libigzip0c.a $ZLIB/libz.a \ + $COMPRESSION/IntelDeflater.o $IGZIP/lib/libisal.a $ZLIB/libz.a \ $PAIRHMM/IntelPairHmm.o \ + ftz/ftz.o \ -o libIntelGKL.dylib else diff --git a/src/main/native/compression/build b/src/main/native/compression/build index 59084e94..3211cc7b 100755 --- a/src/main/native/compression/build +++ b/src/main/native/compression/build @@ -18,6 +18,7 @@ cd - elif [[ $os == "Darwin" ]]; then +cd $IGZIP make clean ./autogen.sh ./configure -target=darwin CFLAGS="-fPIC" --prefix=$(pwd)/usr --libdir=$(pwd)/lib diff --git a/src/main/native/ftz/Makefile b/src/main/native/ftz/Makefile new file mode 100644 index 00000000..5f8e030b --- /dev/null +++ b/src/main/native/ftz/Makefile @@ -0,0 +1,20 @@ +CPPFLAGS=-g -O3 -mavx -fPIC -I$(JAVA_HOME)/include -I$(JAVA_HOME)/include/linux -I$(JAVA_HOME)/include/Darwin + +OUTPUT_OPTION=-MMD -MP -o $@ +LDLIBS= + +TARGET = ftz.o + +SRC = $(wildcard *.cc) +OBJ = $(SRC:.cc=.o) +DEP = $(SRC:.cc=.d) + +all: javah $(TARGET) + +javah: + javah -o ftz.h -cp ../../java com.intel.gkl.ftz.FTZ + +-include $(DEP) + +clean: + rm -f $(OBJ) $(DEP) $(TARGET) diff --git a/src/main/native/ftz/ftz.cc b/src/main/native/ftz/ftz.cc new file mode 100644 index 00000000..9cc290a0 --- /dev/null +++ b/src/main/native/ftz/ftz.cc @@ -0,0 +1,37 @@ +#if defined(_MSC_VER) + #include // SIMD intrinsics for Windows +#else + #include // SIMD intrinsics for GCC +#endif + +#include "ftz.h" + +// _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); + +/* + * Class: com_intel_gkl_ftz_FTZ + * Method: getFlushToZeroNative + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_intel_gkl_ftz_FTZ_getFlushToZeroNative + (JNIEnv *env, jobject obj) +{ + jboolean value = _MM_GET_FLUSH_ZERO_MODE() == _MM_FLUSH_ZERO_ON ? 1 : 0; + return value; +} + +/* + * Class: com_intel_gkl_ftz_FTZ + * Method: setFlushToZeroNative + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_com_intel_gkl_ftz_FTZ_setFlushToZeroNative + (JNIEnv *env, jobject obj, jboolean value) +{ + if (value) { + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON); + } + else { + _MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_OFF); + } +} diff --git a/src/main/native/ftz/ftz.h b/src/main/native/ftz/ftz.h new file mode 100644 index 00000000..bc78e283 --- /dev/null +++ b/src/main/native/ftz/ftz.h @@ -0,0 +1,29 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class com_intel_gkl_ftz_FTZ */ + +#ifndef _Included_com_intel_gkl_ftz_FTZ +#define _Included_com_intel_gkl_ftz_FTZ +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: com_intel_gkl_ftz_FTZ + * Method: getFlushToZeroNative + * Signature: ()Z + */ +JNIEXPORT jboolean JNICALL Java_com_intel_gkl_ftz_FTZ_getFlushToZeroNative + (JNIEnv *, jobject); + +/* + * Class: com_intel_gkl_ftz_FTZ + * Method: setFlushToZeroNative + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_com_intel_gkl_ftz_FTZ_setFlushToZeroNative + (JNIEnv *, jobject, jboolean); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/src/test/java/com/intel/gkl/ftz/FtzUnitTest.java b/src/test/java/com/intel/gkl/ftz/FtzUnitTest.java new file mode 100644 index 00000000..e3b10248 --- /dev/null +++ b/src/test/java/com/intel/gkl/ftz/FtzUnitTest.java @@ -0,0 +1,63 @@ +package com.intel.gkl.ftz; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.testng.annotations.Test; + +public class FtzUnitTest { + private final static Logger log = LogManager.getLogger(FtzUnitTest.class); + + @Test(enabled = true) + public void simpleTest() { + FTZ ftz = new FTZ(); + assert(ftz.isSupported()); + + log.info("Test setting FTZ"); + boolean value = false; + ftz.setFlushToZero(true); + value = ftz.getFlushToZero(); + assert(value == true); + + log.info("Test clearing FTZ"); + value = true; + ftz.setFlushToZero(false); + value = ftz.getFlushToZero(); + assert(value == false); + } + + class ChildThread extends Thread { + boolean ftzValue; + + public void run() { + FTZ ftz = new FTZ(); + assert(ftz.isSupported()); + + ftzValue = ftz.getFlushToZero(); + log.info("Child thread FTZ = " + ftzValue); + } + } + + @Test(enabled = true) + public void childThreadTest() { + FTZ ftz = new FTZ(); + assert (ftz.isSupported()); + + log.info("Parent setting FTZ = true"); + + boolean value = false; + ftz.setFlushToZero(true); + value = ftz.getFlushToZero(); + assert(value == true); + + ChildThread childThread = new ChildThread(); + + childThread.start(); + try { + childThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + assert(childThread.ftzValue == false); + } +} \ No newline at end of file