diff --git a/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/tools/walkers/haplotypecaller/PairHMMLikelihoodCalculationEngine.java b/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/tools/walkers/haplotypecaller/PairHMMLikelihoodCalculationEngine.java index 5b22138fb..1df847e17 100644 --- a/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/tools/walkers/haplotypecaller/PairHMMLikelihoodCalculationEngine.java +++ b/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/tools/walkers/haplotypecaller/PairHMMLikelihoodCalculationEngine.java @@ -101,6 +101,8 @@ public class PairHMMLikelihoodCalculationEngine implements ReadLikelihoodCalcula return new VectorLoglessPairHMM(VectorLoglessPairHMM.Implementation.AVX, pairHmmNativeArgs); case VECTOR_LOGLESS_CACHING_OMP: return new VectorLoglessPairHMM(VectorLoglessPairHMM.Implementation.OMP, pairHmmNativeArgs); + case VECTOR_LOGLESS_CACHING_FPGA_EXPERIMENTAL: + return new VectorLoglessPairHMM(VectorLoglessPairHMM.Implementation.FPGA, pairHmmNativeArgs); case FASTEST_AVAILABLE: try { return new VectorLoglessPairHMM(VectorLoglessPairHMM.Implementation.OMP, pairHmmNativeArgs); @@ -125,7 +127,7 @@ public class PairHMMLikelihoodCalculationEngine implements ReadLikelihoodCalcula default: throw new UserException.BadArgumentValue("pairHMM", "Specified pairHMM implementation is unrecognized or " + "incompatible with the HaplotypeCaller. Acceptable options are ORIGINAL, EXACT, CACHING, LOGLESS_CACHING, " + - "VECTOR_LOGLESS_CACHING, VECTOR_LOGLESS_CACHING_OMP, and ARRAY_LOGLESS."); + "VECTOR_LOGLESS_CACHING, VECTOR_LOGLESS_CACHING_OMP, VECTOR_LOGLESS_CACHING_FPGA_EXPERIMENTAL, and ARRAY_LOGLESS."); } } }; diff --git a/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/utils/pairhmm/VectorLoglessPairHMM.java b/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/utils/pairhmm/VectorLoglessPairHMM.java index d096bbf33..44b62262e 100644 --- a/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/utils/pairhmm/VectorLoglessPairHMM.java +++ b/protected/gatk-tools-protected/src/main/java/org/broadinstitute/gatk/utils/pairhmm/VectorLoglessPairHMM.java @@ -53,6 +53,7 @@ package org.broadinstitute.gatk.utils.pairhmm; import com.intel.gkl.pairhmm.IntelPairHmm; import com.intel.gkl.pairhmm.IntelPairHmmOMP; +import com.intel.gkl.pairhmm.IntelPairHmmFpga; import org.apache.log4j.Logger; import org.broadinstitute.gatk.nativebindings.pairhmm.HaplotypeDataHolder; import org.broadinstitute.gatk.nativebindings.pairhmm.PairHMMNativeArguments; @@ -85,7 +86,9 @@ public class VectorLoglessPairHMM extends JNILoglessPairHMM { /* Use AVX acceleration */ AVX, /* Use AVX acceleration with mult-threading via OpenMP */ - OMP + OMP, + /* Use FPGA acceleration */ + FPGA } protected final static Logger logger = Logger.getLogger(VectorLoglessPairHMM.class); @@ -114,6 +117,15 @@ public class VectorLoglessPairHMM extends JNILoglessPairHMM { logger.info("Using OpenMP multi-threaded AVX-accelerated native PairHMM implementation"); break; + case FPGA: + pairHmm = new IntelPairHmmFpga(); + isSupported = pairHmm.load(null); + if (!isSupported) { + throw new UserException.HardwareFeatureException("Machine does not support FPGA PairHMM."); + } + logger.info("Using FPGA-accelerated native PairHMM implementation"); + break; + default: throw new UserException.HardwareFeatureException("Unknown PairHMM implementation."); } diff --git a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/pairhmm/PairHMM.java b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/pairhmm/PairHMM.java index fcad408c6..3105442a6 100644 --- a/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/pairhmm/PairHMM.java +++ b/public/gatk-utils/src/main/java/org/broadinstitute/gatk/utils/pairhmm/PairHMM.java @@ -64,6 +64,8 @@ public abstract class PairHMM { VECTOR_LOGLESS_CACHING, /* Optimized, multi-threaded AVX implementation of LOGLESS_CACHING called through JNI */ VECTOR_LOGLESS_CACHING_OMP, + /* Optimized, FPGA implementation of LOGLESS_CACHING called through JNI. This is still experimental! */ + VECTOR_LOGLESS_CACHING_FPGA_EXPERIMENTAL, /* Use fastest available implementation. OMP -> AVX -> LOGLESS_CACHING */ FASTEST_AVAILABLE, /* Debugging for vector implementation of LOGLESS_CACHING */