Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support to set and get FTZ #20

Merged
merged 1 commit into from
Aug 4, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ tmp/
*.dylib
*.o
*.a
*.lo

#================================================================================
# from https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore
Expand Down
42 changes: 42 additions & 0 deletions src/main/java/com/intel/gkl/ftz/FTZ.java
Original file line number Diff line number Diff line change
@@ -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);
}
8 changes: 7 additions & 1 deletion src/main/native/build
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ ZLIB=$COMPRESSION/otc_zlib
#ZLIB=$COMPRESSION/zlib-1.2.8
PAIRHMM=pairhmm

cd ftz
make
cd -

cd pairhmm
make
cd -
Expand All @@ -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
Expand Down
1 change: 1 addition & 0 deletions src/main/native/compression/build
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions src/main/native/ftz/Makefile
Original file line number Diff line number Diff line change
@@ -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)
37 changes: 37 additions & 0 deletions src/main/native/ftz/ftz.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#if defined(_MSC_VER)
#include <intrin.h> // SIMD intrinsics for Windows
#else
#include <x86intrin.h> // 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);
}
}
29 changes: 29 additions & 0 deletions src/main/native/ftz/ftz.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

63 changes: 63 additions & 0 deletions src/test/java/com/intel/gkl/ftz/FtzUnitTest.java
Original file line number Diff line number Diff line change
@@ -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);
}
}