Skip to content

Commit

Permalink
Merge pull request #20 from Intel-HLS/gp_ftz
Browse files Browse the repository at this point in the history
Add support to set and get FTZ
  • Loading branch information
pnvaidya authored Aug 4, 2016
2 parents 6a54d9f + bce5e1a commit fcc5af2
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 1 deletion.
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);
}
}

0 comments on commit fcc5af2

Please sign in to comment.