Pulled Mohammad's changes for creating variable sized arrays

Merge branch 'master' of /home/mghodrat/PairHMM/shared-repository into intel_pairhmm

Conflicts:
	PairHMM_JNI/org_broadinstitute_sting_utils_pairhmm_VectorLoglessPairHMM.cc
This commit is contained in:
Karthik Gururaj 2014-01-26 19:40:43 -08:00
commit a14a11c0cf
16 changed files with 875 additions and 1048 deletions

View File

@ -1,10 +1,10 @@
#include "template.h" #include "template.h"
#undef SIMD_TYPE #undef SIMD_ENGINE
#undef SIMD_TYPE_SSE #undef SIMD_ENGINE_SSE
#define SIMD_TYPE avx #define SIMD_ENGINE avx
#define SIMD_TYPE_AVX #define SIMD_ENGINE_AVX
#include "define-float.h" #include "define-float.h"
#include "shift_template.c" #include "shift_template.c"

View File

@ -10,10 +10,10 @@ NUMBER compute_full_prob(testcase *tc, NUMBER *before_last_log = NULL)
Context<NUMBER> ctx; Context<NUMBER> ctx;
NUMBER M[MROWS][MCOLS]; NUMBER M[ROWS][COLS];
NUMBER X[MROWS][MCOLS]; NUMBER X[ROWS][COLS];
NUMBER Y[MROWS][MCOLS]; NUMBER Y[ROWS][COLS];
NUMBER p[MROWS][6]; NUMBER p[ROWS][6];
p[0][MM] = ctx._(0.0); p[0][MM] = ctx._(0.0);
p[0][GapM] = ctx._(0.0); p[0][GapM] = ctx._(0.0);

View File

@ -1,53 +1,51 @@
#include <iostream> #include <iostream>
#ifdef PRECISION #ifdef PRECISION
#undef PRECISION #undef PRECISION
#undef MAIN_TYPE #undef MAIN_TYPE
#undef MAIN_TYPE_SIZE #undef MAIN_TYPE_SIZE
#undef UNION_TYPE #undef UNION_TYPE
#undef IF_128 #undef IF_128
#undef IF_MAIN_TYPE #undef IF_MAIN_TYPE
#undef SHIFT_CONST1 #undef SHIFT_CONST1
#undef SHIFT_CONST2 #undef SHIFT_CONST2
#undef SHIFT_CONST3 #undef SHIFT_CONST3
#undef _128_TYPE #undef _128_TYPE
#undef _256_TYPE #undef SIMD_TYPE
#undef AVX_LENGTH #undef AVX_LENGTH
#undef MAVX_COUNT #undef HAP_TYPE
#undef HAP_TYPE #undef MASK_TYPE
#undef MASK_TYPE #undef MASK_ALL_ONES
#undef MASK_ALL_ONES
#undef SET_VEC_ZERO(__vec) #undef SET_VEC_ZERO(__vec)
#undef VEC_OR(__v1, __v2) #undef VEC_OR(__v1, __v2)
#undef VEC_ADD(__v1, __v2) #undef VEC_ADD(__v1, __v2)
#undef VEC_SUB(__v1, __v2) #undef VEC_SUB(__v1, __v2)
#undef VEC_MUL(__v1, __v2) #undef VEC_MUL(__v1, __v2)
#undef VEC_DIV(__v1, __v2) #undef VEC_DIV(__v1, __v2)
#undef VEC_BLEND(__v1, __v2, __mask) #undef VEC_BLEND(__v1, __v2, __mask)
#undef VEC_BLENDV(__v1, __v2, __maskV) #undef VEC_BLENDV(__v1, __v2, __maskV)
#undef VEC_CAST_256_128(__v1) #undef VEC_CAST_256_128(__v1)
#undef VEC_EXTRACT_128(__v1, __im) #undef VEC_EXTRACT_128(__v1, __im)
#undef VEC_EXTRACT_UNIT(__v1, __im) #undef VEC_EXTRACT_UNIT(__v1, __im)
#undef VEC_SET1_VAL128(__val) #undef VEC_SET1_VAL128(__val)
#undef VEC_MOVE(__v1, __val) #undef VEC_MOVE(__v1, __val)
#undef VEC_CAST_128_256(__v1) #undef VEC_CAST_128_256(__v1)
#undef VEC_INSERT_VAL(__v1, __val, __pos) #undef VEC_INSERT_VAL(__v1, __val, __pos)
#undef VEC_CVT_128_256(__v1) #undef VEC_CVT_128_256(__v1)
#undef VEC_SET1_VAL(__val) #undef VEC_SET1_VAL(__val)
#undef VEC_POPCVT_CHAR(__ch) #undef VEC_POPCVT_CHAR(__ch)
#undef VEC_LDPOPCVT_CHAR(__addr) #undef VEC_LDPOPCVT_CHAR(__addr)
#undef VEC_CMP_EQ(__v1, __v2) #undef VEC_CMP_EQ(__v1, __v2)
#undef VEC_SET_LSE(__val) #undef VEC_SET_LSE(__val)
#undef SHIFT_HAP(__v1, __val) #undef SHIFT_HAP(__v1, __val)
#undef print256b(__v1) #undef MASK_VEC
#undef MASK_VEC #undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst)
#undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) #undef VEC_SHIFT_LEFT_1BIT(__vs)
#undef VEC_SHIFT_LEFT_1BIT(__vs) #undef MASK_ALL_ONES
#undef MASK_ALL_ONES #undef COMPARE_VECS(__v1, __v2)
#undef COMPARE_VECS(__v1, __v2) #undef _256_INT_TYPE
#undef _256_INT_TYPE #undef BITMASK_VEC
#undef BITMASK_VEC
#endif #endif
#define PRECISION d #define PRECISION d
@ -60,10 +58,9 @@
#define SHIFT_CONST2 1 #define SHIFT_CONST2 1
#define SHIFT_CONST3 8 #define SHIFT_CONST3 8
#define _128_TYPE __m128d #define _128_TYPE __m128d
#define _256_TYPE __m256d #define SIMD_TYPE __m256d
#define _256_INT_TYPE __m256i #define _256_INT_TYPE __m256i
#define AVX_LENGTH 4 #define AVX_LENGTH 4
#define MAVX_COUNT (MROWS+7)/AVX_LENGTH
#define HAP_TYPE __m128i #define HAP_TYPE __m128i
#define MASK_TYPE uint64_t #define MASK_TYPE uint64_t
#define MASK_ALL_ONES 0xFFFFFFFFFFFFFFFF #define MASK_ALL_ONES 0xFFFFFFFFFFFFFFFF
@ -135,12 +132,9 @@
#define SHIFT_HAP(__v1, __val) \ #define SHIFT_HAP(__v1, __val) \
__v1 = _mm_insert_epi32(_mm_slli_si128(__v1, 4), __val.i, 0) __v1 = _mm_insert_epi32(_mm_slli_si128(__v1, 4), __val.i, 0)
#define print256b(__v1) \
print256bDP(__v1)
#define VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) \ #define VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) \
__vdst = _mm256_castpd128_pd256(__vsLow) ; \ __vdst = _mm256_castpd128_pd256(__vsLow) ; \
__vdst = _mm256_insertf128_pd(__vdst, __vsHigh, 1) ; __vdst = _mm256_insertf128_pd(__vdst, __vsHigh, 1) ;
#define VEC_SHIFT_LEFT_1BIT(__vs) \ #define VEC_SHIFT_LEFT_1BIT(__vs) \
__vs = _mm_slli_epi64(__vs, 1) __vs = _mm_slli_epi64(__vs, 1)
@ -156,15 +150,14 @@
exit(0) ; \ exit(0) ; \
} \ } \
} \ } \
} }
class BitMaskVec_double { class BitMaskVec_double {
MASK_VEC low_, high_ ; MASK_VEC low_, high_ ;
_256_TYPE combined_ ; SIMD_TYPE combined_ ;
public:
public:
inline MASK_TYPE& getLowEntry(int index) { inline MASK_TYPE& getLowEntry(int index) {
return low_.masks[index] ; return low_.masks[index] ;
} }
@ -172,9 +165,8 @@ public:
return high_.masks[index] ; return high_.masks[index] ;
} }
inline const _256_TYPE& getCombinedMask() { inline const SIMD_TYPE& getCombinedMask() {
VEC_SSE_TO_AVX(low_.vecf, high_.vecf, combined_) ; VEC_SSE_TO_AVX(low_.vecf, high_.vecf, combined_) ;
return combined_ ; return combined_ ;
} }

View File

@ -1,53 +1,51 @@
#include <iostream> #include <iostream>
#ifdef PRECISION #ifdef PRECISION
#undef PRECISION #undef PRECISION
#undef MAIN_TYPE #undef MAIN_TYPE
#undef MAIN_TYPE_SIZE #undef MAIN_TYPE_SIZE
#undef UNION_TYPE #undef UNION_TYPE
#undef IF_128 #undef IF_128
#undef IF_MAIN_TYPE #undef IF_MAIN_TYPE
#undef SHIFT_CONST1 #undef SHIFT_CONST1
#undef SHIFT_CONST2 #undef SHIFT_CONST2
#undef SHIFT_CONST3 #undef SHIFT_CONST3
#undef _128_TYPE #undef _128_TYPE
#undef _256_TYPE #undef SIMD_TYPE
#undef AVX_LENGTH #undef AVX_LENGTH
#undef MAVX_COUNT #undef HAP_TYPE
#undef HAP_TYPE #undef MASK_TYPE
#undef MASK_TYPE #undef MASK_ALL_ONES
#undef MASK_ALL_ONES
#undef SET_VEC_ZERO(__vec) #undef SET_VEC_ZERO(__vec)
#undef VEC_OR(__v1, __v2) #undef VEC_OR(__v1, __v2)
#undef VEC_ADD(__v1, __v2) #undef VEC_ADD(__v1, __v2)
#undef VEC_SUB(__v1, __v2) #undef VEC_SUB(__v1, __v2)
#undef VEC_MUL(__v1, __v2) #undef VEC_MUL(__v1, __v2)
#undef VEC_DIV(__v1, __v2) #undef VEC_DIV(__v1, __v2)
#undef VEC_BLEND(__v1, __v2, __mask) #undef VEC_BLEND(__v1, __v2, __mask)
#undef VEC_BLENDV(__v1, __v2, __maskV) #undef VEC_BLENDV(__v1, __v2, __maskV)
#undef VEC_CAST_256_128(__v1) #undef VEC_CAST_256_128(__v1)
#undef VEC_EXTRACT_128(__v1, __im) #undef VEC_EXTRACT_128(__v1, __im)
#undef VEC_EXTRACT_UNIT(__v1, __im) #undef VEC_EXTRACT_UNIT(__v1, __im)
#undef VEC_SET1_VAL128(__val) #undef VEC_SET1_VAL128(__val)
#undef VEC_MOVE(__v1, __val) #undef VEC_MOVE(__v1, __val)
#undef VEC_CAST_128_256(__v1) #undef VEC_CAST_128_256(__v1)
#undef VEC_INSERT_VAL(__v1, __val, __pos) #undef VEC_INSERT_VAL(__v1, __val, __pos)
#undef VEC_CVT_128_256(__v1) #undef VEC_CVT_128_256(__v1)
#undef VEC_SET1_VAL(__val) #undef VEC_SET1_VAL(__val)
#undef VEC_POPCVT_CHAR(__ch) #undef VEC_POPCVT_CHAR(__ch)
#undef VEC_LDPOPCVT_CHAR(__addr) #undef VEC_LDPOPCVT_CHAR(__addr)
#undef VEC_CMP_EQ(__v1, __v2) #undef VEC_CMP_EQ(__v1, __v2)
#undef VEC_SET_LSE(__val) #undef VEC_SET_LSE(__val)
#undef SHIFT_HAP(__v1, __val) #undef SHIFT_HAP(__v1, __val)
#undef print256b(__v1) #undef MASK_VEC
#undef MASK_VEC #undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst)
#undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) #undef VEC_SHIFT_LEFT_1BIT(__vs)
#undef VEC_SHIFT_LEFT_1BIT(__vs) #undef MASK_ALL_ONES
#undef MASK_ALL_ONES #undef COMPARE_VECS(__v1, __v2)
#undef COMPARE_VECS(__v1, __v2) #undef _256_INT_TYPE
#undef _256_INT_TYPE #undef BITMASK_VEC
#undef BITMASK_VEC
#endif #endif
#define PRECISION s #define PRECISION s
@ -61,10 +59,9 @@
#define SHIFT_CONST2 3 #define SHIFT_CONST2 3
#define SHIFT_CONST3 4 #define SHIFT_CONST3 4
#define _128_TYPE __m128 #define _128_TYPE __m128
#define _256_TYPE __m256 #define SIMD_TYPE __m256
#define _256_INT_TYPE __m256i #define _256_INT_TYPE __m256i
#define AVX_LENGTH 8 #define AVX_LENGTH 8
#define MAVX_COUNT (MROWS+7)/AVX_LENGTH
#define HAP_TYPE UNION_TYPE #define HAP_TYPE UNION_TYPE
#define MASK_TYPE uint32_t #define MASK_TYPE uint32_t
#define MASK_ALL_ONES 0xFFFFFFFF #define MASK_ALL_ONES 0xFFFFFFFF
@ -136,12 +133,9 @@
#define SHIFT_HAP(__v1, __val) \ #define SHIFT_HAP(__v1, __val) \
_vector_shift_lastavxs(__v1, __val.f); _vector_shift_lastavxs(__v1, __val.f);
#define print256b(__v1) \
print256bFP(__v1)
#define VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) \ #define VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) \
__vdst = _mm256_castps128_ps256(__vsLow) ; \ __vdst = _mm256_castps128_ps256(__vsLow) ; \
__vdst = _mm256_insertf128_ps(__vdst, __vsHigh, 1) ; __vdst = _mm256_insertf128_ps(__vdst, __vsHigh, 1) ;
#define VEC_SHIFT_LEFT_1BIT(__vs) \ #define VEC_SHIFT_LEFT_1BIT(__vs) \
__vs = _mm_slli_epi32(__vs, 1) __vs = _mm_slli_epi32(__vs, 1)
@ -156,14 +150,14 @@
exit(0) ; \ exit(0) ; \
} \ } \
} \ } \
} }
class BitMaskVec_float { class BitMaskVec_float {
MASK_VEC low_, high_ ; MASK_VEC low_, high_ ;
_256_TYPE combined_ ; SIMD_TYPE combined_ ;
public: public:
inline MASK_TYPE& getLowEntry(int index) { inline MASK_TYPE& getLowEntry(int index) {
return low_.masks[index] ; return low_.masks[index] ;
@ -172,9 +166,8 @@ public:
return high_.masks[index] ; return high_.masks[index] ;
} }
inline const _256_TYPE& getCombinedMask() { inline const SIMD_TYPE& getCombinedMask() {
VEC_SSE_TO_AVX(low_.vecf, high_.vecf, combined_) ; VEC_SSE_TO_AVX(low_.vecf, high_.vecf, combined_) ;
return combined_ ; return combined_ ;
} }

View File

@ -1,53 +1,51 @@
#ifdef PRECISION #ifdef PRECISION
#undef PRECISION #undef PRECISION
#undef MAIN_TYPE #undef MAIN_TYPE
#undef MAIN_TYPE_SIZE #undef MAIN_TYPE_SIZE
#undef UNION_TYPE #undef UNION_TYPE
#undef IF_128 #undef IF_128
#undef IF_MAIN_TYPE #undef IF_MAIN_TYPE
#undef SHIFT_CONST1 #undef SHIFT_CONST1
#undef SHIFT_CONST2 #undef SHIFT_CONST2
#undef SHIFT_CONST3 #undef SHIFT_CONST3
#undef _128_TYPE #undef _128_TYPE
#undef _256_TYPE #undef SIMD_TYPE
#undef AVX_LENGTH #undef AVX_LENGTH
#undef MAVX_COUNT #undef HAP_TYPE
#undef HAP_TYPE #undef MASK_TYPE
#undef MASK_TYPE #undef MASK_ALL_ONES
#undef MASK_ALL_ONES
#undef VEC_EXTRACT_UNIT(__v1, __im) #undef VEC_EXTRACT_UNIT(__v1, __im)
#undef VEC_INSERT_UNIT(__v1,__ins,__im) #undef VEC_INSERT_UNIT(__v1,__ins,__im)
#undef SET_VEC_ZERO(__vec) #undef SET_VEC_ZERO(__vec)
#undef VEC_OR(__v1, __v2) #undef VEC_OR(__v1, __v2)
#undef VEC_ADD(__v1, __v2) #undef VEC_ADD(__v1, __v2)
#undef VEC_SUB(__v1, __v2) #undef VEC_SUB(__v1, __v2)
#undef VEC_MUL(__v1, __v2) #undef VEC_MUL(__v1, __v2)
#undef VEC_DIV(__v1, __v2) #undef VEC_DIV(__v1, __v2)
#undef VEC_BLEND(__v1, __v2, __mask) #undef VEC_BLEND(__v1, __v2, __mask)
#undef VEC_BLENDV(__v1, __v2, __maskV) #undef VEC_BLENDV(__v1, __v2, __maskV)
#undef VEC_CAST_256_128(__v1) #undef VEC_CAST_256_128(__v1)
#undef VEC_EXTRACT_128(__v1, __im) #undef VEC_EXTRACT_128(__v1, __im)
#undef VEC_EXTRACT_UNIT(__v1, __im) #undef VEC_EXTRACT_UNIT(__v1, __im)
#undef VEC_SET1_VAL128(__val) #undef VEC_SET1_VAL128(__val)
#undef VEC_MOVE(__v1, __val) #undef VEC_MOVE(__v1, __val)
#undef VEC_CAST_128_256(__v1) #undef VEC_CAST_128_256(__v1)
#undef VEC_INSERT_VAL(__v1, __val, __pos) #undef VEC_INSERT_VAL(__v1, __val, __pos)
#undef VEC_CVT_128_256(__v1) #undef VEC_CVT_128_256(__v1)
#undef VEC_SET1_VAL(__val) #undef VEC_SET1_VAL(__val)
#undef VEC_POPCVT_CHAR(__ch) #undef VEC_POPCVT_CHAR(__ch)
#undef VEC_LDPOPCVT_CHAR(__addr) #undef VEC_LDPOPCVT_CHAR(__addr)
#undef VEC_CMP_EQ(__v1, __v2) #undef VEC_CMP_EQ(__v1, __v2)
#undef VEC_SET_LSE(__val) #undef VEC_SET_LSE(__val)
#undef SHIFT_HAP(__v1, __val) #undef SHIFT_HAP(__v1, __val)
#undef print256b(__v1) #undef MASK_VEC
#undef MASK_VEC #undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst)
#undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) #undef VEC_SHIFT_LEFT_1BIT(__vs)
#undef VEC_SHIFT_LEFT_1BIT(__vs) #undef MASK_ALL_ONES
#undef MASK_ALL_ONES #undef COMPARE_VECS(__v1, __v2)
#undef COMPARE_VECS(__v1, __v2) #undef _256_INT_TYPE
#undef _256_INT_TYPE #undef BITMASK_VEC
#undef BITMASK_VEC
#endif #endif
#define SSE #define SSE
@ -62,10 +60,9 @@
#define SHIFT_CONST2 8 #define SHIFT_CONST2 8
#define SHIFT_CONST3 0 #define SHIFT_CONST3 0
#define _128_TYPE __m128d #define _128_TYPE __m128d
#define _256_TYPE __m128d #define SIMD_TYPE __m128d
#define _256_INT_TYPE __m128i #define _256_INT_TYPE __m128i
#define AVX_LENGTH 2 #define AVX_LENGTH 2
#define MAVX_COUNT (MROWS+3)/AVX_LENGTH
#define HAP_TYPE __m128i #define HAP_TYPE __m128i
#define MASK_TYPE uint64_t #define MASK_TYPE uint64_t
#define MASK_ALL_ONES 0xFFFFFFFFFFFFFFFFL #define MASK_ALL_ONES 0xFFFFFFFFFFFFFFFFL
@ -129,9 +126,7 @@
class BitMaskVec_sse_double { class BitMaskVec_sse_double {
MASK_VEC combined_ ; MASK_VEC combined_ ;
public:
public:
inline MASK_TYPE& getLowEntry(int index) { inline MASK_TYPE& getLowEntry(int index) {
return combined_.masks[index] ; return combined_.masks[index] ;
} }
@ -139,7 +134,7 @@ public:
return combined_.masks[AVX_LENGTH/2+index] ; return combined_.masks[AVX_LENGTH/2+index] ;
} }
inline const _256_TYPE& getCombinedMask() { inline const SIMD_TYPE& getCombinedMask() {
return combined_.vecf ; return combined_.vecf ;
} }

View File

@ -1,53 +1,51 @@
#ifdef PRECISION #ifdef PRECISION
#undef PRECISION #undef PRECISION
#undef MAIN_TYPE #undef MAIN_TYPE
#undef MAIN_TYPE_SIZE #undef MAIN_TYPE_SIZE
#undef UNION_TYPE #undef UNION_TYPE
#undef IF_128 #undef IF_128
#undef IF_MAIN_TYPE #undef IF_MAIN_TYPE
#undef SHIFT_CONST1 #undef SHIFT_CONST1
#undef SHIFT_CONST2 #undef SHIFT_CONST2
#undef SHIFT_CONST3 #undef SHIFT_CONST3
#undef _128_TYPE #undef _128_TYPE
#undef _256_TYPE #undef SIMD_TYPE
#undef AVX_LENGTH #undef AVX_LENGTH
#undef MAVX_COUNT #undef HAP_TYPE
#undef HAP_TYPE #undef MASK_TYPE
#undef MASK_TYPE #undef MASK_ALL_ONES
#undef MASK_ALL_ONES
#undef VEC_EXTRACT_UNIT(__v1, __im) #undef VEC_EXTRACT_UNIT(__v1, __im)
#undef VEC_INSERT_UNIT(__v1,__ins,__im) #undef VEC_INSERT_UNIT(__v1,__ins,__im)
#undef SET_VEC_ZERO(__vec) #undef SET_VEC_ZERO(__vec)
#undef VEC_OR(__v1, __v2) #undef VEC_OR(__v1, __v2)
#undef VEC_ADD(__v1, __v2) #undef VEC_ADD(__v1, __v2)
#undef VEC_SUB(__v1, __v2) #undef VEC_SUB(__v1, __v2)
#undef VEC_MUL(__v1, __v2) #undef VEC_MUL(__v1, __v2)
#undef VEC_DIV(__v1, __v2) #undef VEC_DIV(__v1, __v2)
#undef VEC_BLEND(__v1, __v2, __mask) #undef VEC_BLEND(__v1, __v2, __mask)
#undef VEC_BLENDV(__v1, __v2, __maskV) #undef VEC_BLENDV(__v1, __v2, __maskV)
#undef VEC_CAST_256_128(__v1) #undef VEC_CAST_256_128(__v1)
#undef VEC_EXTRACT_128(__v1, __im) #undef VEC_EXTRACT_128(__v1, __im)
#undef VEC_EXTRACT_UNIT(__v1, __im) #undef VEC_EXTRACT_UNIT(__v1, __im)
#undef VEC_SET1_VAL128(__val) #undef VEC_SET1_VAL128(__val)
#undef VEC_MOVE(__v1, __val) #undef VEC_MOVE(__v1, __val)
#undef VEC_CAST_128_256(__v1) #undef VEC_CAST_128_256(__v1)
#undef VEC_INSERT_VAL(__v1, __val, __pos) #undef VEC_INSERT_VAL(__v1, __val, __pos)
#undef VEC_CVT_128_256(__v1) #undef VEC_CVT_128_256(__v1)
#undef VEC_SET1_VAL(__val) #undef VEC_SET1_VAL(__val)
#undef VEC_POPCVT_CHAR(__ch) #undef VEC_POPCVT_CHAR(__ch)
#undef VEC_LDPOPCVT_CHAR(__addr) #undef VEC_LDPOPCVT_CHAR(__addr)
#undef VEC_CMP_EQ(__v1, __v2) #undef VEC_CMP_EQ(__v1, __v2)
#undef VEC_SET_LSE(__val) #undef VEC_SET_LSE(__val)
#undef SHIFT_HAP(__v1, __val) #undef SHIFT_HAP(__v1, __val)
#undef print256b(__v1) #undef MASK_VEC
#undef MASK_VEC #undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst)
#undef VEC_SSE_TO_AVX(__vsLow, __vsHigh, __vdst) #undef VEC_SHIFT_LEFT_1BIT(__vs)
#undef VEC_SHIFT_LEFT_1BIT(__vs) #undef MASK_ALL_ONES
#undef MASK_ALL_ONES #undef COMPARE_VECS(__v1, __v2)
#undef COMPARE_VECS(__v1, __v2) #undef _256_INT_TYPE
#undef _256_INT_TYPE #undef BITMASK_VEC
#undef BITMASK_VEC
#endif #endif
#define SSE #define SSE
@ -62,10 +60,10 @@
#define SHIFT_CONST2 4 #define SHIFT_CONST2 4
#define SHIFT_CONST3 0 #define SHIFT_CONST3 0
#define _128_TYPE __m128 #define _128_TYPE __m128
#define _256_TYPE __m128 #define SIMD_TYPE __m128
#define _256_INT_TYPE __m128i #define _256_INT_TYPE __m128i
#define AVX_LENGTH 4 #define AVX_LENGTH 4
#define MAVX_COUNT (MROWS+3)/AVX_LENGTH //#define MAVX_COUNT (MROWS+3)/AVX_LENGTH
#define HAP_TYPE UNION_TYPE #define HAP_TYPE UNION_TYPE
#define MASK_TYPE uint32_t #define MASK_TYPE uint32_t
#define MASK_ALL_ONES 0xFFFFFFFF #define MASK_ALL_ONES 0xFFFFFFFF
@ -129,8 +127,7 @@ class BitMaskVec_sse_float {
MASK_VEC combined_ ; MASK_VEC combined_ ;
public: public:
inline MASK_TYPE& getLowEntry(int index) { inline MASK_TYPE& getLowEntry(int index) {
return combined_.masks[index] ; return combined_.masks[index] ;
} }
@ -138,7 +135,7 @@ public:
return combined_.masks[AVX_LENGTH/2+index] ; return combined_.masks[AVX_LENGTH/2+index] ;
} }
inline const _256_TYPE& getCombinedMask() { inline const SIMD_TYPE& getCombinedMask() {
return combined_.vecf ; return combined_.vecf ;
} }

View File

@ -68,7 +68,7 @@ JNIEXPORT void JNICALL Java_org_broadinstitute_sting_utils_pairhmm_VectorLogless
haplotypeBasesLength = env->GetArrayLength(haplotypeBasesGlobalRef); haplotypeBasesLength = env->GetArrayLength(haplotypeBasesGlobalRef);
#ifdef ENABLE_ASSERTIONS #ifdef ENABLE_ASSERTIONS
assert(haplotypeBasesArray && "haplotypeBasesArray not initialized in JNI"); assert(haplotypeBasesArray && "haplotypeBasesArray not initialized in JNI");
assert(haplotypeBasesLength < MCOLS); //assert(haplotypeBasesLength < MCOLS);
#endif #endif
#ifdef DEBUG0_1 #ifdef DEBUG0_1
cout << "JNI haplotype length "<<haplotypeBasesLength<<"\n"; cout << "JNI haplotype length "<<haplotypeBasesLength<<"\n";
@ -145,7 +145,7 @@ JNIEXPORT void JNICALL Java_org_broadinstitute_sting_utils_pairhmm_VectorLogless
assert(insertionGOPArray && "insertionGOP array not initialized in JNI"); assert(insertionGOPArray && "insertionGOP array not initialized in JNI");
assert(deletionGOPArray && "deletionGOP array not initialized in JNI"); assert(deletionGOPArray && "deletionGOP array not initialized in JNI");
assert(overallGCPArray && "overallGCP array not initialized in JNI"); assert(overallGCPArray && "overallGCP array not initialized in JNI");
assert(readLength < MROWS); //assert(readLength < MROWS);
assert(readLength == env->GetArrayLength(readQuals)); assert(readLength == env->GetArrayLength(readQuals));
assert(readLength == env->GetArrayLength(insertionGOP)); assert(readLength == env->GetArrayLength(insertionGOP));
assert(readLength == env->GetArrayLength(deletionGOP)); assert(readLength == env->GetArrayLength(deletionGOP));

View File

@ -4,27 +4,8 @@
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
//#define DEBUG
#define MUSTAFA
#define KARTHIK
/* void CONCAT(CONCAT(precompute_masks_,SIMD_ENGINE), PRECISION)(const testcase& tc, int COLS, int numMaskVecs, MASK_TYPE (*maskArr)[NUM_DISTINCT_CHARS]) {
template <class T>
string getBinaryStr (T val, int numBitsToWrite) {
ostringstream oss ;
uint64_t mask = ((T) 0x1) << (numBitsToWrite-1) ;
for (int i=numBitsToWrite-1; i >= 0; --i) {
oss << ((val & mask) >> i) ;
mask >>= 1 ;
}
return oss.str() ;
}
*/
#ifdef MUSTAFA
void GEN_INTRINSIC(GEN_INTRINSIC(precompute_masks_,SIMD_TYPE), PRECISION)(const testcase& tc, int COLS, int numMaskVecs, MASK_TYPE (*maskArr)[NUM_DISTINCT_CHARS]) {
const int maskBitCnt = MAIN_TYPE_SIZE ; const int maskBitCnt = MAIN_TYPE_SIZE ;
@ -58,7 +39,7 @@ void GEN_INTRINSIC(GEN_INTRINSIC(precompute_masks_,SIMD_TYPE), PRECISION)(const
} }
void GEN_INTRINSIC(GEN_INTRINSIC(init_masks_for_row_,SIMD_TYPE), PRECISION)(const testcase& tc, char* rsArr, MASK_TYPE* lastMaskShiftOut, int beginRowIndex, int numRowsToProcess) { void CONCAT(CONCAT(init_masks_for_row_,SIMD_ENGINE), PRECISION)(const testcase& tc, char* rsArr, MASK_TYPE* lastMaskShiftOut, int beginRowIndex, int numRowsToProcess) {
for (int ri=0; ri < numRowsToProcess; ++ri) { for (int ri=0; ri < numRowsToProcess; ++ri) {
rsArr[ri] = ConvertChar::get(tc.rs[ri+beginRowIndex-1]) ; rsArr[ri] = ConvertChar::get(tc.rs[ri+beginRowIndex-1]) ;
@ -69,7 +50,6 @@ void GEN_INTRINSIC(GEN_INTRINSIC(init_masks_for_row_,SIMD_TYPE), PRECISION)(cons
} }
} }
#define SET_MASK_WORD(__dstMask, __srcMask, __lastShiftOut, __shiftBy, __maskBitCnt){ \ #define SET_MASK_WORD(__dstMask, __srcMask, __lastShiftOut, __shiftBy, __maskBitCnt){ \
MASK_TYPE __bitMask = (((MASK_TYPE)0x1) << __shiftBy) - 1 ; \ MASK_TYPE __bitMask = (((MASK_TYPE)0x1) << __shiftBy) - 1 ; \
MASK_TYPE __nextShiftOut = (__srcMask & __bitMask) << (__maskBitCnt - __shiftBy) ; \ MASK_TYPE __nextShiftOut = (__srcMask & __bitMask) << (__maskBitCnt - __shiftBy) ; \
@ -78,7 +58,7 @@ void GEN_INTRINSIC(GEN_INTRINSIC(init_masks_for_row_,SIMD_TYPE), PRECISION)(cons
} }
void GEN_INTRINSIC(GEN_INTRINSIC(update_masks_for_cols_, SIMD_TYPE), PRECISION)(int maskIndex, BITMASK_VEC& bitMaskVec, MASK_TYPE (*maskArr) [NUM_DISTINCT_CHARS], char* rsArr, MASK_TYPE* lastMaskShiftOut, int maskBitCnt) { void CONCAT(CONCAT(update_masks_for_cols_,SIMD_ENGINE), PRECISION)(int maskIndex, BITMASK_VEC& bitMaskVec, MASK_TYPE (*maskArr) [NUM_DISTINCT_CHARS], char* rsArr, MASK_TYPE* lastMaskShiftOut, int maskBitCnt) {
for (int ei=0; ei < AVX_LENGTH/2; ++ei) { for (int ei=0; ei < AVX_LENGTH/2; ++ei) {
SET_MASK_WORD(bitMaskVec.getLowEntry(ei), maskArr[maskIndex][rsArr[ei]], SET_MASK_WORD(bitMaskVec.getLowEntry(ei), maskArr[maskIndex][rsArr[ei]],
@ -92,48 +72,14 @@ void GEN_INTRINSIC(GEN_INTRINSIC(update_masks_for_cols_, SIMD_TYPE), PRECISION)(
} }
//void GEN_INTRINSIC(computeDistVec, PRECISION) (BITMASK_VEC& bitMaskVec, _256_TYPE& distm, _256_TYPE& _1_distm, _256_TYPE& distmChosen, const _256_TYPE& distmSel, int firstRowIndex, int lastRowIndex) { inline void CONCAT(CONCAT(computeDistVec,SIMD_ENGINE), PRECISION) (BITMASK_VEC& bitMaskVec, SIMD_TYPE& distm, SIMD_TYPE& _1_distm, SIMD_TYPE& distmChosen) {
inline void GEN_INTRINSIC(GEN_INTRINSIC(computeDistVec, SIMD_TYPE), PRECISION) (BITMASK_VEC& bitMaskVec, _256_TYPE& distm, _256_TYPE& _1_distm, _256_TYPE& distmChosen) {
//#define computeDistVec() {
#ifdef DEBUGG
long long *temp1 = (long long *)(&maskV);
double *temp2 = (double *)(&distm);
double *temp3 = (double *)(&_1_distm);
printf("***\n%lx\n%lx\n%f\n%f\n%f\n%f\n***\n", temp1[0], temp1[1], temp2[0], temp2[1], temp3[0], temp3[1]);
#endif
distmChosen = VEC_BLENDV(distm, _1_distm, bitMaskVec.getCombinedMask()) ; distmChosen = VEC_BLENDV(distm, _1_distm, bitMaskVec.getCombinedMask()) ;
/*COMPARE_VECS(distmChosen, distmSel, firstRowIndex, lastRowIndex) ;*/
bitMaskVec.shift_left_1bit() ; bitMaskVec.shift_left_1bit() ;
} }
template<class NUMBER> void CONCAT(CONCAT(initializeVectors,SIMD_ENGINE), PRECISION)(int ROWS, int COLS, NUMBER* shiftOutM, NUMBER *shiftOutX, NUMBER *shiftOutY, Context<NUMBER> ctx, testcase *tc, SIMD_TYPE *p_MM, SIMD_TYPE *p_GAPM, SIMD_TYPE *p_MX, SIMD_TYPE *p_XX, SIMD_TYPE *p_MY, SIMD_TYPE *p_YY, SIMD_TYPE *distm1D)
/*
template<class NUMBER>
struct HmmData {
int ROWS ;
int COLS ;
NUMBER shiftOutM[MROWS+MCOLS+AVX_LENGTH], shiftOutX[MROWS+MCOLS+AVX_LENGTH], shiftOutY[MROWS+MCOLS+AVX_LENGTH] ;
Context<NUMBER> ctx ;
testcase* tc ;
_256_TYPE p_MM[MAVX_COUNT], p_GAPM[MAVX_COUNT], p_MX[MAVX_COUNT], p_XX[MAVX_COUNT], p_MY[MAVX_COUNT], p_YY[MAVX_COUNT], distm1D[MAVX_COUNT] ;
_256_TYPE pGAPM, pMM, pMX, pXX, pMY, pYY ;
UNION_TYPE M_t, M_t_1, M_t_2, X_t, X_t_1, X_t_2, Y_t, Y_t_1, Y_t_2, M_t_y, M_t_1_y ;
UNION_TYPE rs , rsN ;
_256_TYPE distmSel;
_256_TYPE distm, _1_distm;
} ;
*/
#endif // MUSTAFA
template<class NUMBER> void GEN_INTRINSIC(GEN_INTRINSIC(initializeVectors, SIMD_TYPE), PRECISION)(int ROWS, int COLS, NUMBER* shiftOutM, NUMBER *shiftOutX, NUMBER *shiftOutY, Context<NUMBER> ctx, testcase *tc, _256_TYPE *p_MM, _256_TYPE *p_GAPM, _256_TYPE *p_MX, _256_TYPE *p_XX, _256_TYPE *p_MY, _256_TYPE *p_YY, _256_TYPE *distm1D)
{ {
NUMBER zero = ctx._(0.0); NUMBER zero = ctx._(0.0);
NUMBER init_Y = ctx.INITIAL_CONSTANT / (tc->haplen); NUMBER init_Y = ctx.INITIAL_CONSTANT / (tc->haplen);
@ -158,7 +104,6 @@ template<class NUMBER> void GEN_INTRINSIC(GEN_INTRINSIC(initializeVectors, SIMD_
*ptr_p_MY = ctx._(0.0); *ptr_p_MY = ctx._(0.0);
*ptr_p_GAPM = ctx._(0.0); *ptr_p_GAPM = ctx._(0.0);
for (int r = 1; r < ROWS; r++) for (int r = 1; r < ROWS; r++)
{ {
int _i = tc->i[r-1] & 127; int _i = tc->i[r-1] & 127;
@ -169,14 +114,8 @@ template<class NUMBER> void GEN_INTRINSIC(GEN_INTRINSIC(initializeVectors, SIMD_
*(ptr_p_GAPM+r-1) = ctx._(1.0) - ctx.ph2pr[_c]; *(ptr_p_GAPM+r-1) = ctx._(1.0) - ctx.ph2pr[_c];
*(ptr_p_MX+r-1) = ctx.ph2pr[_i]; *(ptr_p_MX+r-1) = ctx.ph2pr[_i];
*(ptr_p_XX+r-1) = ctx.ph2pr[_c]; *(ptr_p_XX+r-1) = ctx.ph2pr[_c];
#ifdef KARTHIK
*(ptr_p_MY+r-1) = ctx.ph2pr[_d]; *(ptr_p_MY+r-1) = ctx.ph2pr[_d];
*(ptr_p_YY+r-1) = ctx.ph2pr[_c]; *(ptr_p_YY+r-1) = ctx.ph2pr[_c];
#else
*(ptr_p_MY+r-1) = (r == ROWS - 1) ? ctx._(1.0) : ctx.ph2pr[_d];
*(ptr_p_YY+r-1) = (r == ROWS - 1) ? ctx._(1.0) : ctx.ph2pr[_c];
#endif
} }
NUMBER *ptr_distm1D = (NUMBER *)distm1D; NUMBER *ptr_distm1D = (NUMBER *)distm1D;
@ -188,13 +127,13 @@ template<class NUMBER> void GEN_INTRINSIC(GEN_INTRINSIC(initializeVectors, SIMD_
} }
template<class NUMBER> inline void GEN_INTRINSIC(GEN_INTRINSIC(stripINITIALIZATION, SIMD_TYPE), PRECISION)( template<class NUMBER> inline void CONCAT(CONCAT(stripeINITIALIZATION,SIMD_ENGINE), PRECISION)(
int stripIdx, Context<NUMBER> ctx, testcase *tc, _256_TYPE &pGAPM, _256_TYPE &pMM, _256_TYPE &pMX, _256_TYPE &pXX, _256_TYPE &pMY, _256_TYPE &pYY, int stripeIdx, Context<NUMBER> ctx, testcase *tc, SIMD_TYPE &pGAPM, SIMD_TYPE &pMM, SIMD_TYPE &pMX, SIMD_TYPE &pXX, SIMD_TYPE &pMY, SIMD_TYPE &pYY,
_256_TYPE &rs, UNION_TYPE &rsN, _256_TYPE &distm, _256_TYPE &_1_distm, _256_TYPE *distm1D, _256_TYPE N_packed256, _256_TYPE *p_MM , _256_TYPE *p_GAPM , SIMD_TYPE &rs, UNION_TYPE &rsN, SIMD_TYPE &distm, SIMD_TYPE &_1_distm, SIMD_TYPE *distm1D, SIMD_TYPE N_packed256, SIMD_TYPE *p_MM , SIMD_TYPE *p_GAPM ,
_256_TYPE *p_MX, _256_TYPE *p_XX , _256_TYPE *p_MY, _256_TYPE *p_YY, UNION_TYPE &M_t_2, UNION_TYPE &X_t_2, UNION_TYPE &M_t_1, UNION_TYPE &X_t_1, SIMD_TYPE *p_MX, SIMD_TYPE *p_XX , SIMD_TYPE *p_MY, SIMD_TYPE *p_YY, UNION_TYPE &M_t_2, UNION_TYPE &X_t_2, UNION_TYPE &M_t_1, UNION_TYPE &X_t_1,
UNION_TYPE &Y_t_2, UNION_TYPE &Y_t_1, UNION_TYPE &M_t_1_y, NUMBER* shiftOutX, NUMBER* shiftOutM) UNION_TYPE &Y_t_2, UNION_TYPE &Y_t_1, UNION_TYPE &M_t_1_y, NUMBER* shiftOutX, NUMBER* shiftOutM)
{ {
int i = stripIdx; int i = stripeIdx;
pGAPM = p_GAPM[i]; pGAPM = p_GAPM[i];
pMM = p_MM[i]; pMM = p_MM[i];
pMX = p_MX[i]; pMX = p_MX[i];
@ -206,17 +145,12 @@ template<class NUMBER> inline void GEN_INTRINSIC(GEN_INTRINSIC(stripINITIALIZATI
NUMBER init_Y = ctx.INITIAL_CONSTANT / (tc->haplen); NUMBER init_Y = ctx.INITIAL_CONSTANT / (tc->haplen);
UNION_TYPE packed1; packed1.d = VEC_SET1_VAL(1.0); UNION_TYPE packed1; packed1.d = VEC_SET1_VAL(1.0);
UNION_TYPE packed3; packed3.d = VEC_SET1_VAL(3.0); UNION_TYPE packed3; packed3.d = VEC_SET1_VAL(3.0);
/* compare rs and N */
#ifndef MUSTAFA
rs = VEC_LDPOPCVT_CHAR((tc->irs+i*AVX_LENGTH));
rsN.d = VEC_CMP_EQ(N_packed256, rs);
#endif
distm = distm1D[i]; distm = distm1D[i];
_1_distm = VEC_SUB(packed1.d, distm); _1_distm = VEC_SUB(packed1.d, distm);
#ifdef KARTHIK
distm = VEC_DIV(distm, packed3.d); distm = VEC_DIV(distm, packed3.d);
#endif
/* initialize M_t_2, M_t_1, X_t_2, X_t_1, Y_t_2, Y_t_1 */ /* initialize M_t_2, M_t_1, X_t_2, X_t_1, Y_t_2, Y_t_1 */
M_t_2.d = VEC_SET1_VAL(zero); M_t_2.d = VEC_SET1_VAL(zero);
X_t_2.d = VEC_SET1_VAL(zero); X_t_2.d = VEC_SET1_VAL(zero);
@ -236,13 +170,11 @@ template<class NUMBER> inline void GEN_INTRINSIC(GEN_INTRINSIC(stripINITIALIZATI
M_t_1_y = M_t_1; M_t_1_y = M_t_1;
} }
inline SIMD_TYPE CONCAT(CONCAT(computeDISTM,SIMD_ENGINE), PRECISION)(int d, int COLS, testcase * tc, HAP_TYPE &hap, SIMD_TYPE rs, UNION_TYPE rsN, SIMD_TYPE N_packed256,
SIMD_TYPE distm, SIMD_TYPE _1_distm)
inline _256_TYPE GEN_INTRINSIC(GEN_INTRINSIC(computeDISTM, SIMD_TYPE), PRECISION)(int d, int COLS, testcase * tc, HAP_TYPE &hap, _256_TYPE rs, UNION_TYPE rsN, _256_TYPE N_packed256,
_256_TYPE distm, _256_TYPE _1_distm)
{ {
UNION_TYPE hapN, rshap; UNION_TYPE hapN, rshap;
_256_TYPE cond; SIMD_TYPE cond;
IF_32 shiftInHap; IF_32 shiftInHap;
int *hap_ptr = tc->ihap; int *hap_ptr = tc->ihap;
@ -251,7 +183,7 @@ inline _256_TYPE GEN_INTRINSIC(GEN_INTRINSIC(computeDISTM, SIMD_TYPE), PRECISION
/* shift hap */ /* shift hap */
SHIFT_HAP(hap, shiftInHap); SHIFT_HAP(hap, shiftInHap);
_256_TYPE hapF = VEC_CVT_128_256(hap); SIMD_TYPE hapF = VEC_CVT_128_256(hap);
rshap.d = VEC_CMP_EQ(rs, hapF); rshap.d = VEC_CMP_EQ(rs, hapF);
hapN.d = VEC_CMP_EQ(N_packed256, hapF); hapN.d = VEC_CMP_EQ(N_packed256, hapF);
@ -261,27 +193,19 @@ inline _256_TYPE GEN_INTRINSIC(GEN_INTRINSIC(computeDISTM, SIMD_TYPE), PRECISION
cond = VEC_OR(cond, hapN.d); cond = VEC_OR(cond, hapN.d);
/* distm1D = (cond) ? 1-distm1D : distm1D; */ /* distm1D = (cond) ? 1-distm1D : distm1D; */
_256_TYPE distmSel = VEC_BLENDV(distm, _1_distm, cond); SIMD_TYPE distmSel = VEC_BLENDV(distm, _1_distm, cond);
return distmSel; return distmSel;
} }
inline void GEN_INTRINSIC(GEN_INTRINSIC(computeMXY, SIMD_TYPE), PRECISION)(UNION_TYPE &M_t, UNION_TYPE &X_t, UNION_TYPE &Y_t, UNION_TYPE &M_t_y, inline void CONCAT(CONCAT(computeMXY,SIMD_ENGINE), PRECISION)(UNION_TYPE &M_t, UNION_TYPE &X_t, UNION_TYPE &Y_t, UNION_TYPE &M_t_y,
UNION_TYPE M_t_2, UNION_TYPE X_t_2, UNION_TYPE Y_t_2, UNION_TYPE M_t_1, UNION_TYPE X_t_1, UNION_TYPE M_t_1_y, UNION_TYPE Y_t_1, UNION_TYPE M_t_2, UNION_TYPE X_t_2, UNION_TYPE Y_t_2, UNION_TYPE M_t_1, UNION_TYPE X_t_1, UNION_TYPE M_t_1_y, UNION_TYPE Y_t_1,
_256_TYPE pMM, _256_TYPE pGAPM, _256_TYPE pMX, _256_TYPE pXX, _256_TYPE pMY, _256_TYPE pYY, _256_TYPE distmSel) SIMD_TYPE pMM, SIMD_TYPE pGAPM, SIMD_TYPE pMX, SIMD_TYPE pXX, SIMD_TYPE pMY, SIMD_TYPE pYY, SIMD_TYPE distmSel)
{ {
/* Compute M_t <= distm * (p_MM*M_t_2 + p_GAPM*X_t_2 + p_GAPM*Y_t_2) */ /* Compute M_t <= distm * (p_MM*M_t_2 + p_GAPM*X_t_2 + p_GAPM*Y_t_2) */
M_t.d = VEC_MUL(VEC_ADD(VEC_ADD(VEC_MUL(M_t_2.d, pMM), VEC_MUL(X_t_2.d, pGAPM)), VEC_MUL(Y_t_2.d, pGAPM)), distmSel); M_t.d = VEC_MUL(VEC_ADD(VEC_ADD(VEC_MUL(M_t_2.d, pMM), VEC_MUL(X_t_2.d, pGAPM)), VEC_MUL(Y_t_2.d, pGAPM)), distmSel);
#ifdef DEBUG
double *temp1 = (double *)(&pGAPM);
double *temp2 = (double *)(&pMM);
double *temp3 = (double *)(&distmSel);
printf("%f\n%f\n%f\n%f\n%f\n%f\n", temp1[0], temp1[1], temp2[0], temp2[1], temp3[0], temp3[1]);
//printf("%f\n%f\n%f\n%f\n", X_t_2.f[0], X_t_2.f[1], Y_t_2.f[0], Y_t_2.f[1]);
printf("%f\n%f\n----------------------------------------------------------------------------\n", M_t.f[0], M_t.f[1]);
#endif
M_t_y = M_t; M_t_y = M_t;
/* Compute X_t */ /* Compute X_t */
@ -291,56 +215,52 @@ inline void GEN_INTRINSIC(GEN_INTRINSIC(computeMXY, SIMD_TYPE), PRECISION)(UNION
Y_t.d = VEC_ADD(VEC_MUL(M_t_1_y.d, pMY) , VEC_MUL(Y_t_1.d, pYY)); Y_t.d = VEC_ADD(VEC_MUL(M_t_1_y.d, pMY) , VEC_MUL(Y_t_1.d, pYY));
} }
template<class NUMBER> NUMBER GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_,SIMD_TYPE), PRECISION) (testcase *tc, NUMBER *before_last_log = NULL) template<class NUMBER> NUMBER CONCAT(CONCAT(compute_full_prob_,SIMD_ENGINE), PRECISION) (testcase *tc, NUMBER *before_last_log = NULL)
{ {
_256_TYPE p_MM [MAVX_COUNT], p_GAPM [MAVX_COUNT], p_MX [MAVX_COUNT]; int ROWS = tc->rslen + 1;
_256_TYPE p_XX [MAVX_COUNT], p_MY [MAVX_COUNT], p_YY [MAVX_COUNT]; int COLS = tc->haplen + 1;
_256_TYPE distm1D[MAVX_COUNT]; int MAVX_COUNT = (ROWS+AVX_LENGTH-1)/AVX_LENGTH;
NUMBER shiftOutM[MROWS+MCOLS+AVX_LENGTH], shiftOutX[MROWS+MCOLS+AVX_LENGTH], shiftOutY[MROWS+MCOLS+AVX_LENGTH];
SIMD_TYPE p_MM [MAVX_COUNT], p_GAPM [MAVX_COUNT], p_MX [MAVX_COUNT];
SIMD_TYPE p_XX [MAVX_COUNT], p_MY [MAVX_COUNT], p_YY [MAVX_COUNT];
SIMD_TYPE distm1D[MAVX_COUNT];
NUMBER shiftOutM[ROWS+COLS+AVX_LENGTH], shiftOutX[ROWS+COLS+AVX_LENGTH], shiftOutY[ROWS+COLS+AVX_LENGTH];
UNION_TYPE M_t, M_t_1, M_t_2, X_t, X_t_1, X_t_2, Y_t, Y_t_1, Y_t_2, M_t_y, M_t_1_y; UNION_TYPE M_t, M_t_1, M_t_2, X_t, X_t_1, X_t_2, Y_t, Y_t_1, Y_t_2, M_t_y, M_t_1_y;
_256_TYPE pGAPM, pMM, pMX, pXX, pMY, pYY; SIMD_TYPE pGAPM, pMM, pMX, pXX, pMY, pYY;
struct timeval start, end; struct timeval start, end;
NUMBER result_avx2; NUMBER result_avx2;
Context<NUMBER> ctx; Context<NUMBER> ctx;
UNION_TYPE rs , rsN; UNION_TYPE rs , rsN;
HAP_TYPE hap; HAP_TYPE hap;
_256_TYPE distmSel, distmChosen ; SIMD_TYPE distmSel, distmChosen ;
_256_TYPE distm, _1_distm; SIMD_TYPE distm, _1_distm;
int r, c; int r, c;
int ROWS = tc->rslen + 1;
int COLS = tc->haplen + 1;
int AVX_COUNT = (ROWS+7)/8;
NUMBER zero = ctx._(0.0); NUMBER zero = ctx._(0.0);
UNION_TYPE packed1; packed1.d = VEC_SET1_VAL(1.0); UNION_TYPE packed1; packed1.d = VEC_SET1_VAL(1.0);
_256_TYPE N_packed256 = VEC_POPCVT_CHAR('N'); SIMD_TYPE N_packed256 = VEC_POPCVT_CHAR('N');
NUMBER init_Y = ctx.INITIAL_CONSTANT / (tc->haplen); NUMBER init_Y = ctx.INITIAL_CONSTANT / (tc->haplen);
int remainingRows = (ROWS-1) % AVX_LENGTH; int remainingRows = (ROWS-1) % AVX_LENGTH;
int strip_cnt = ((ROWS-1) / AVX_LENGTH) + (remainingRows!=0); int stripe_cnt = ((ROWS-1) / AVX_LENGTH) + (remainingRows!=0);
#ifdef MUSTAFA
const int maskBitCnt = MAIN_TYPE_SIZE ; const int maskBitCnt = MAIN_TYPE_SIZE ;
const int numMaskVecs = (COLS+ROWS+maskBitCnt-1)/maskBitCnt ; // ceil function const int numMaskVecs = (COLS+ROWS+maskBitCnt-1)/maskBitCnt ; // ceil function
MASK_TYPE maskArr[numMaskVecs][NUM_DISTINCT_CHARS] ; MASK_TYPE maskArr[numMaskVecs][NUM_DISTINCT_CHARS] ;
GEN_INTRINSIC(GEN_INTRINSIC(precompute_masks_,SIMD_TYPE), PRECISION)(*tc, COLS, numMaskVecs, maskArr) ; CONCAT(CONCAT(precompute_masks_,SIMD_ENGINE), PRECISION)(*tc, COLS, numMaskVecs, maskArr) ;
char rsArr[AVX_LENGTH] ; char rsArr[AVX_LENGTH] ;
MASK_TYPE lastMaskShiftOut[AVX_LENGTH] ; MASK_TYPE lastMaskShiftOut[AVX_LENGTH] ;
#endif CONCAT(CONCAT(initializeVectors,SIMD_ENGINE), PRECISION)<NUMBER>(ROWS, COLS, shiftOutM, shiftOutX, shiftOutY,
GEN_INTRINSIC(GEN_INTRINSIC(initializeVectors,SIMD_TYPE), PRECISION)<NUMBER>(ROWS, COLS, shiftOutM, shiftOutX, shiftOutY,
ctx, tc, p_MM, p_GAPM, p_MX, p_XX, p_MY, p_YY, distm1D); ctx, tc, p_MM, p_GAPM, p_MX, p_XX, p_MY, p_YY, distm1D);
//for (int __ii=0; __ii < 10; ++__ii) for (int i=0;i<stripe_cnt-1;i++)
for (int i=0;i<strip_cnt-1;i++)
{ {
//STRIP_INITIALIZATION //STRIPE_INITIALIZATION
GEN_INTRINSIC(GEN_INTRINSIC(stripINITIALIZATION,SIMD_TYPE), PRECISION)(i, ctx, tc, pGAPM, pMM, pMX, pXX, pMY, pYY, rs.d, rsN, distm, _1_distm, distm1D, N_packed256, p_MM , p_GAPM , CONCAT(CONCAT(stripeINITIALIZATION,SIMD_ENGINE), PRECISION)(i, ctx, tc, pGAPM, pMM, pMX, pXX, pMY, pYY, rs.d, rsN, distm, _1_distm, distm1D, N_packed256, p_MM , p_GAPM ,
p_MX, p_XX , p_MY, p_YY, M_t_2, X_t_2, M_t_1, X_t_1, Y_t_2, Y_t_1, M_t_1_y, shiftOutX, shiftOutM); p_MX, p_XX , p_MY, p_YY, M_t_2, X_t_2, M_t_1, X_t_1, Y_t_2, Y_t_1, M_t_1_y, shiftOutX, shiftOutM);
#ifdef MUSTAFA CONCAT(CONCAT(init_masks_for_row_,SIMD_ENGINE), PRECISION)(*tc, rsArr, lastMaskShiftOut, i*AVX_LENGTH+1, AVX_LENGTH) ;
GEN_INTRINSIC(GEN_INTRINSIC(init_masks_for_row_,SIMD_TYPE), PRECISION)(*tc, rsArr, lastMaskShiftOut, i*AVX_LENGTH+1, AVX_LENGTH) ;
#endif
// Since there are no shift intrinsics in AVX, keep the masks in 2 SSE vectors // Since there are no shift intrinsics in AVX, keep the masks in 2 SSE vectors
BITMASK_VEC bitMaskVec ; BITMASK_VEC bitMaskVec ;
@ -348,28 +268,20 @@ template<class NUMBER> NUMBER GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_,SIM
for (int begin_d=1;begin_d<COLS+AVX_LENGTH;begin_d+=MAIN_TYPE_SIZE) for (int begin_d=1;begin_d<COLS+AVX_LENGTH;begin_d+=MAIN_TYPE_SIZE)
{ {
int numMaskBitsToProcess = std::min(MAIN_TYPE_SIZE, COLS+AVX_LENGTH-begin_d) ; int numMaskBitsToProcess = std::min(MAIN_TYPE_SIZE, COLS+AVX_LENGTH-begin_d) ;
#ifdef MUSTAFA CONCAT(CONCAT(update_masks_for_cols_,SIMD_ENGINE), PRECISION)((begin_d-1)/MAIN_TYPE_SIZE, bitMaskVec, maskArr, rsArr, lastMaskShiftOut, maskBitCnt) ;
GEN_INTRINSIC(GEN_INTRINSIC(update_masks_for_cols_,SIMD_TYPE), PRECISION)((begin_d-1)/MAIN_TYPE_SIZE, bitMaskVec, maskArr, rsArr, lastMaskShiftOut, maskBitCnt) ;
#endif
// if (d % MAIN_TYPE_SIZE == 1)
for (int mbi=0; mbi < numMaskBitsToProcess; ++mbi) { for (int mbi=0; mbi < numMaskBitsToProcess; ++mbi) {
#ifdef MUSTAFA CONCAT(CONCAT(computeDistVec,SIMD_ENGINE), PRECISION) (bitMaskVec, distm, _1_distm, distmChosen) ;
GEN_INTRINSIC(GEN_INTRINSIC(computeDistVec,SIMD_TYPE), PRECISION) (bitMaskVec, distm, _1_distm, distmChosen) ;
#else
distmChosen = GEN_INTRINSIC(GEN_INTRINSIC(computeDISTM,SIMD_TYPE), PRECISION)(begin_d+mbi, COLS, tc, hap, rs.d, rsN, N_packed256, distm, _1_distm);
#endif
int ShiftIdx = begin_d + mbi + AVX_LENGTH; int ShiftIdx = begin_d + mbi + AVX_LENGTH;
GEN_INTRINSIC(GEN_INTRINSIC(computeMXY,SIMD_TYPE), PRECISION)(M_t, X_t, Y_t, M_t_y, M_t_2, X_t_2, Y_t_2, M_t_1, X_t_1, M_t_1_y, Y_t_1, CONCAT(CONCAT(computeMXY,SIMD_ENGINE), PRECISION)(M_t, X_t, Y_t, M_t_y, M_t_2, X_t_2, Y_t_2, M_t_1, X_t_1, M_t_1_y, Y_t_1,
pMM, pGAPM, pMX, pXX, pMY, pYY, distmChosen); pMM, pGAPM, pMX, pXX, pMY, pYY, distmChosen);
GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift, SIMD_TYPE), PRECISION)(M_t, shiftOutM[ShiftIdx], shiftOutM[begin_d+mbi]); CONCAT(CONCAT(_vector_shift,SIMD_ENGINE), PRECISION)(M_t, shiftOutM[ShiftIdx], shiftOutM[begin_d+mbi]);
GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift, SIMD_TYPE), PRECISION)(X_t, shiftOutX[ShiftIdx], shiftOutX[begin_d+mbi]); CONCAT(CONCAT(_vector_shift,SIMD_ENGINE), PRECISION)(X_t, shiftOutX[ShiftIdx], shiftOutX[begin_d+mbi]);
GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift, SIMD_TYPE), PRECISION)(Y_t_1, shiftOutY[ShiftIdx], shiftOutY[begin_d+mbi]); CONCAT(CONCAT(_vector_shift,SIMD_ENGINE), PRECISION)(Y_t_1, shiftOutY[ShiftIdx], shiftOutY[begin_d+mbi]);
M_t_2 = M_t_1; M_t_1 = M_t; X_t_2 = X_t_1; X_t_1 = X_t; M_t_2 = M_t_1; M_t_1 = M_t; X_t_2 = X_t_1; X_t_1 = X_t;
Y_t_2 = Y_t_1; Y_t_1 = Y_t; M_t_1_y = M_t_y; Y_t_2 = Y_t_1; Y_t_1 = Y_t; M_t_1_y = M_t_y;
@ -377,17 +289,16 @@ template<class NUMBER> NUMBER GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_,SIM
} }
} }
int i = strip_cnt-1; int i = stripe_cnt-1;
{ {
//STRIP_INITIALIZATION //STRIPE_INITIALIZATION
GEN_INTRINSIC(GEN_INTRINSIC(stripINITIALIZATION,SIMD_TYPE), PRECISION)(i, ctx, tc, pGAPM, pMM, pMX, pXX, pMY, pYY, rs.d, rsN, distm, _1_distm, distm1D, N_packed256, p_MM , p_GAPM , CONCAT(CONCAT(stripeINITIALIZATION,SIMD_ENGINE), PRECISION)(i, ctx, tc, pGAPM, pMM, pMX, pXX, pMY, pYY, rs.d, rsN, distm, _1_distm, distm1D, N_packed256, p_MM , p_GAPM ,
p_MX, p_XX , p_MY, p_YY, M_t_2, X_t_2, M_t_1, X_t_1, Y_t_2, Y_t_1, M_t_1_y, shiftOutX, shiftOutM); p_MX, p_XX , p_MY, p_YY, M_t_2, X_t_2, M_t_1, X_t_1, Y_t_2, Y_t_1, M_t_1_y, shiftOutX, shiftOutM);
if (remainingRows==0) remainingRows=AVX_LENGTH; if (remainingRows==0) remainingRows=AVX_LENGTH;
#ifdef MUSTAFA CONCAT(CONCAT(init_masks_for_row_,SIMD_ENGINE), PRECISION)(*tc, rsArr, lastMaskShiftOut, i*AVX_LENGTH+1, remainingRows) ;
GEN_INTRINSIC(GEN_INTRINSIC(init_masks_for_row_,SIMD_TYPE), PRECISION)(*tc, rsArr, lastMaskShiftOut, i*AVX_LENGTH+1, remainingRows) ;
#endif SIMD_TYPE sumM, sumX;
_256_TYPE sumM, sumX;
sumM = VEC_SET1_VAL(zero); sumM = VEC_SET1_VAL(zero);
sumX = VEC_SET1_VAL(zero); sumX = VEC_SET1_VAL(zero);
@ -396,31 +307,24 @@ template<class NUMBER> NUMBER GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_,SIM
for (int begin_d=1;begin_d<COLS+remainingRows-1;begin_d+=MAIN_TYPE_SIZE) for (int begin_d=1;begin_d<COLS+remainingRows-1;begin_d+=MAIN_TYPE_SIZE)
{ {
int numMaskBitsToProcess = std::min(MAIN_TYPE_SIZE, COLS+remainingRows-1-begin_d) ; int numMaskBitsToProcess = std::min(MAIN_TYPE_SIZE, COLS+remainingRows-1-begin_d) ;
#ifdef MUSTAFA CONCAT(CONCAT(update_masks_for_cols_,SIMD_ENGINE),PRECISION)((begin_d-1)/MAIN_TYPE_SIZE, bitMaskVec, maskArr, rsArr, lastMaskShiftOut, maskBitCnt) ;
GEN_INTRINSIC(GEN_INTRINSIC(update_masks_for_cols_, SIMD_TYPE),PRECISION)((begin_d-1)/MAIN_TYPE_SIZE, bitMaskVec, maskArr, rsArr, lastMaskShiftOut, maskBitCnt) ;
#endif
for (int mbi=0; mbi < numMaskBitsToProcess; ++mbi) { for (int mbi=0; mbi < numMaskBitsToProcess; ++mbi) {
#ifdef MUSTAFA CONCAT(CONCAT(computeDistVec,SIMD_ENGINE), PRECISION) (bitMaskVec, distm, _1_distm, distmChosen) ;
GEN_INTRINSIC(GEN_INTRINSIC(computeDistVec, SIMD_TYPE), PRECISION) (bitMaskVec, distm, _1_distm, distmChosen) ;
#else
distmChosen = GEN_INTRINSIC(GEN_INTRINSIC(computeDISTM,SIMD_TYPE), PRECISION)(begin_d+mbi, COLS, tc, hap, rs.d, rsN, N_packed256, distm, _1_distm);
#endif
int ShiftIdx = begin_d + mbi +AVX_LENGTH; int ShiftIdx = begin_d + mbi +AVX_LENGTH;
GEN_INTRINSIC(GEN_INTRINSIC(computeMXY, SIMD_TYPE), PRECISION)(M_t, X_t, Y_t, M_t_y, M_t_2, X_t_2, Y_t_2, M_t_1, X_t_1, M_t_1_y, Y_t_1, CONCAT(CONCAT(computeMXY,SIMD_ENGINE), PRECISION)(M_t, X_t, Y_t, M_t_y, M_t_2, X_t_2, Y_t_2, M_t_1, X_t_1, M_t_1_y, Y_t_1,
pMM, pGAPM, pMX, pXX, pMY, pYY, distmChosen); pMM, pGAPM, pMX, pXX, pMY, pYY, distmChosen);
sumM = VEC_ADD(sumM, M_t.d); sumM = VEC_ADD(sumM, M_t.d);
GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift_last, SIMD_TYPE), PRECISION)(M_t, shiftOutM[ShiftIdx]); CONCAT(CONCAT(_vector_shift_last,SIMD_ENGINE), PRECISION)(M_t, shiftOutM[ShiftIdx]);
sumX = VEC_ADD(sumX, X_t.d); sumX = VEC_ADD(sumX, X_t.d);
GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift_last, SIMD_TYPE), PRECISION)(X_t, shiftOutX[ShiftIdx]); CONCAT(CONCAT(_vector_shift_last,SIMD_ENGINE), PRECISION)(X_t, shiftOutX[ShiftIdx]);
GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift_last, SIMD_TYPE), PRECISION)(Y_t_1, shiftOutY[ShiftIdx]); CONCAT(CONCAT(_vector_shift_last,SIMD_ENGINE), PRECISION)(Y_t_1, shiftOutY[ShiftIdx]);
M_t_2 = M_t_1; M_t_1 = M_t; X_t_2 = X_t_1; X_t_1 = X_t; M_t_2 = M_t_1; M_t_1 = M_t; X_t_2 = X_t_1; X_t_1 = X_t;
Y_t_2 = Y_t_1; Y_t_1 = Y_t; M_t_1_y = M_t_y; Y_t_2 = Y_t_1; Y_t_1 = Y_t; M_t_1_y = M_t_y;
@ -431,7 +335,6 @@ template<class NUMBER> NUMBER GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_,SIM
sumMX.d = VEC_ADD(sumM, sumX); sumMX.d = VEC_ADD(sumM, sumX);
result_avx2 = sumMX.f[remainingRows-1]; result_avx2 = sumMX.f[remainingRows-1];
} }
//printf("result_avx2: %f\n", result_avx2);
return result_avx2; return result_avx2;
} }

View File

@ -1,10 +1,9 @@
#include "headers.h" #include "headers.h"
#include "template.h" #include "template.h"
#include "vector_defs.h" #include "vector_defs.h"
#define SIMD_TYPE avx #define SIMD_ENGINE avx
#define SIMD_TYPE_AVX #define SIMD_ENGINE_AVX
#define BATCH_SIZE 10000 #define BATCH_SIZE 10000
@ -13,48 +12,12 @@
double getCurrClk(); double getCurrClk();
int thread_level_parallelism_enabled = false ; int thread_level_parallelism_enabled = false ;
void print128b_F(__m128 x)
{
float *p = (float *)(&x);
for (int i=3;i>=0;i--)
printf("%f ", *(p+i));
printf("\n");
}
void print128b_D(__m128d x)
{
double *p = (double *)(&x);
for (int i=1;i>=0;i--)
printf("%f ", *(p+i));
printf("\n");
}
int main() int main()
{ {
/*
IF_128f x;
x.f = _mm_set_ps(1.0, 2.0, 3.0, 4.0);
IF_32 shiftIn, shiftOut;
shiftIn.f = 5.0f;
print128b_F(x.f);
GEN_INTRINSIC(_vector_shift, s)(x, shiftIn, shiftOut);
print128b_F(x.f);
IF_128d y;
y.f = _mm_set_pd(10.0, 11.0);
IF_64 shiftInd, shiftOutd;
shiftInd.f = 12.0;
print128b_D(y.f);
GEN_INTRINSIC(_vector_shift, d)(y, shiftInd, shiftOutd);
print128b_D(y.f);
exit(0);
*/
testcase* tc = new testcase[BATCH_SIZE]; testcase* tc = new testcase[BATCH_SIZE];
float result[BATCH_SIZE], result_avxf; float result[BATCH_SIZE], result_avxf;
double result_avxd; double result_avxd;
//struct timeval start, end;
double lastClk = 0.0 ; double lastClk = 0.0 ;
double aggregateTimeRead = 0.0; double aggregateTimeRead = 0.0;
double aggregateTimeCompute = 0.0; double aggregateTimeCompute = 0.0;
@ -63,11 +26,10 @@ int main()
// Need to call it once to initialize the static array // Need to call it once to initialize the static array
ConvertChar::init() ; ConvertChar::init() ;
// char* ompEnvVar = getenv("OMP_NUM_THREADS") ;
// char* ompEnvVar = getenv("OMP_NUM_THREADS") ; // if (ompEnvVar != NULL && ompEnvVar != "" && ompEnvVar != "1" ) {
// if (ompEnvVar != NULL && ompEnvVar != "" && ompEnvVar != "1" ) { // thread_level_parallelism_enabled = true ;
// thread_level_parallelism_enabled = true ; // }
// }
bool noMoreData = false; bool noMoreData = false;
int count =0; int count =0;
@ -83,47 +45,34 @@ int main()
noMoreData = true; noMoreData = true;
break; break;
} }
//gettimeofday(&end, NULL);
aggregateTimeRead += (getCurrClk() - lastClk) ; aggregateTimeRead += (getCurrClk() - lastClk) ;
//((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec));
//gettimeofday(&start, NULL);
lastClk = getCurrClk() ; lastClk = getCurrClk() ;
//#pragma omp parallel for schedule(dynamic) if(thread_level_parallelism_enabled) //#pragma omp parallel for schedule(dynamic) if(thread_level_parallelism_enabled)
for (int b=0;b<read_count;b++) for (int b=0;b<read_count;b++)
{ {
result_avxf = GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_, SIMD_TYPE), s)<float>(&tc[b]); result_avxf = CONCAT(CONCAT(compute_full_prob_,SIMD_ENGINE), s)<float>(&tc[b]);
#ifdef RUN_HYBRID #ifdef RUN_HYBRID
#define MIN_ACCEPTED 1e-28f #define MIN_ACCEPTED 1e-28f
if (result_avxf < MIN_ACCEPTED) { if (result_avxf < MIN_ACCEPTED) {
//printf("**************** RUNNING DOUBLE ******************\n");
count++; count++;
result_avxd = GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_, SIMD_TYPE), d)<double>(&tc[b]); result_avxd = CONCAT(CONCAT(compute_full_prob_,SIMD_ENGINE), d)<double>(&tc[b]);
result[b] = log10(result_avxd) - log10(ldexp(1.0, 1020.f)); result[b] = log10(result_avxd) - log10(ldexp(1.0, 1020.f));
} }
else else
result[b] = log10f(result_avxf) - log10f(ldexpf(1.f, 120.f)); result[b] = log10f(result_avxf) - log10f(ldexpf(1.f, 120.f));
#endif #endif
#ifndef RUN_HYBRID #ifndef RUN_HYBRID
result[b] = log10f(result_avxf) - log10f(ldexpf(1.f, 120.f)); result[b] = log10f(result_avxf) - log10f(ldexpf(1.f, 120.f));
#endif #endif
} }
//gettimeofday(&end, NULL);
aggregateTimeCompute += (getCurrClk() - lastClk) ; aggregateTimeCompute += (getCurrClk() - lastClk) ;
//((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec));
//gettimeofday(&start, NULL);
lastClk = getCurrClk() ; lastClk = getCurrClk() ;
//for (int b=0;b<read_count;b++) for (int b=0;b<read_count;b++)
//printf("%E\n", result[b]); printf("%E\n", result[b]);
//gettimeofday(&end, NULL);
aggregateTimeWrite += (getCurrClk() - lastClk) ; aggregateTimeWrite += (getCurrClk() - lastClk) ;
//((end.tv_sec * 1000000 + end.tv_usec) - (start.tv_sec * 1000000 + start.tv_usec));
} }
delete tc; delete tc;

View File

@ -1,10 +1,9 @@
#ifdef PRECISION #ifdef PRECISION
#ifdef SIMD_TYPE_AVX #ifdef SIMD_ENGINE_AVX
inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift,SIMD_TYPE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn, MAIN_TYPE &shiftOut) inline void CONCAT(CONCAT(_vector_shift,SIMD_ENGINE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn, MAIN_TYPE &shiftOut)
{ {
IF_128 xlow , xhigh; IF_128 xlow , xhigh;
/* cast x to xlow */ /* cast x to xlow */
xlow.f = VEC_CAST_256_128(x.d); xlow.f = VEC_CAST_256_128(x.d);
@ -33,9 +32,8 @@ inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift,SIMD_TYPE), PRECISION) (UN
} }
inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift_last, SIMD_TYPE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn) inline void CONCAT(CONCAT(_vector_shift_last,SIMD_ENGINE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn)
{ {
IF_128 xlow , xhigh; IF_128 xlow , xhigh;
/* cast x to xlow */ /* cast x to xlow */
xlow.f = VEC_CAST_256_128(x.d); xlow.f = VEC_CAST_256_128(x.d);
@ -61,9 +59,9 @@ inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift_last, SIMD_TYPE), PRECISIO
#endif #endif
#ifdef SIMD_TYPE_SSE #ifdef SIMD_ENGINE_SSE
inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift, SIMD_TYPE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn, MAIN_TYPE &shiftOut) inline void CONCAT(CONCAT(_vector_shift,SIMD_ENGINE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn, MAIN_TYPE &shiftOut)
{ {
IF_MAIN_TYPE tempIn, tempOut; IF_MAIN_TYPE tempIn, tempOut;
tempIn.f = shiftIn; tempIn.f = shiftIn;
@ -76,7 +74,7 @@ inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift, SIMD_TYPE), PRECISION) (U
x.i = VEC_INSERT_UNIT(x.i , tempIn.i, SHIFT_CONST3); x.i = VEC_INSERT_UNIT(x.i , tempIn.i, SHIFT_CONST3);
} }
inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift_last, SIMD_TYPE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn) inline void CONCAT(CONCAT(_vector_shift_last,SIMD_ENGINE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn)
{ {
IF_MAIN_TYPE temp; temp.f = shiftIn; IF_MAIN_TYPE temp; temp.f = shiftIn;
/* shift */ /* shift */

View File

@ -1,10 +1,10 @@
#include "template.h" #include "template.h"
#undef SIMD_TYPE #undef SIMD_ENGINE
#undef SIMD_TYPE_AVX #undef SIMD_ENGINE_AVX
#define SIMD_TYPE sse #define SIMD_ENGINE sse
#define SIMD_TYPE_SSE #define SIMD_ENGINE_SSE
#include "define-sse-float.h" #include "define-sse-float.h"
#include "shift_template.c" #include "shift_template.c"

View File

@ -10,11 +10,11 @@
#define MY 4 #define MY 4
#define YY 5 #define YY 5
#define MROWS 500 //#define MROWS 500
#define MCOLS 1000 //#define MCOLS 1000
#define CAT(X,Y) X####Y #define CAT(X,Y) X####Y
#define GEN_INTRINSIC(X,Y) CAT(X,Y) #define CONCAT(X,Y) CAT(X,Y)
#define ALIGNED __attribute__((aligned(32))) #define ALIGNED __attribute__((aligned(32)))

View File

@ -96,7 +96,7 @@ int read_testcase(testcase *tc, FILE* ifp)
tc->haplen = strlen(tc->hap); tc->haplen = strlen(tc->hap);
tc->rslen = strlen(tc->rs); tc->rslen = strlen(tc->rs);
assert(tc->rslen < MROWS); //assert(tc->rslen < MROWS);
tc->ihap = (int *) malloc(tc->haplen*sizeof(int)); tc->ihap = (int *) malloc(tc->haplen*sizeof(int));
tc->irs = (int *) malloc(tc->rslen*sizeof(int)); tc->irs = (int *) malloc(tc->rslen*sizeof(int));
@ -216,7 +216,7 @@ int read_mod_testcase(ifstream& fptr, testcase* tc, bool reformat)
//cout << "Lengths "<<tc->haplen <<" "<<tc->rslen<<"\n"; //cout << "Lengths "<<tc->haplen <<" "<<tc->rslen<<"\n";
memcpy(tc->rs, tokens[1].c_str(),tokens[1].size()); memcpy(tc->rs, tokens[1].c_str(),tokens[1].size());
assert(tokens.size() == 2 + 4*(tc->rslen)); assert(tokens.size() == 2 + 4*(tc->rslen));
assert(tc->rslen < MROWS); //assert(tc->rslen < MROWS);
for(unsigned j=0;j<tc->rslen;++j) for(unsigned j=0;j<tc->rslen;++j)
tc->q[j] = (char)convToInt(tokens[2+0*tc->rslen+j]); tc->q[j] = (char)convToInt(tokens[2+0*tc->rslen+j]);
for(unsigned j=0;j<tc->rslen;++j) for(unsigned j=0;j<tc->rslen;++j)

View File

@ -1,9 +1,9 @@
#undef SIMD_TYPE #undef SIMD_ENGINE
#undef SIMD_TYPE_AVX #undef SIMD_ENGINE_AVX
#undef SIMD_TYPE_SSE #undef SIMD_ENGINE_SSE
#define SIMD_TYPE avx #define SIMD_ENGINE avx
#define SIMD_TYPE_AVX #define SIMD_ENGINE_AVX
#include "define-float.h" #include "define-float.h"
#include "vector_function_prototypes.h" #include "vector_function_prototypes.h"
@ -11,11 +11,11 @@
#include "define-double.h" #include "define-double.h"
#include "vector_function_prototypes.h" #include "vector_function_prototypes.h"
#undef SIMD_TYPE #undef SIMD_ENGINE
#undef SIMD_TYPE_AVX #undef SIMD_ENGINE_AVX
#define SIMD_TYPE sse #define SIMD_ENGINE sse
#define SIMD_TYPE_SSE #define SIMD_ENGINE_SSE
#include "define-sse-float.h" #include "define-sse-float.h"
@ -24,7 +24,7 @@
#include "define-sse-double.h" #include "define-sse-double.h"
#include "vector_function_prototypes.h" #include "vector_function_prototypes.h"
#undef SIMD_TYPE #undef SIMD_ENGINE
#undef SIMD_TYPE_AVX #undef SIMD_ENGINE_AVX
#undef SIMD_TYPE_SSE #undef SIMD_ENGINE_SSE

View File

@ -1,19 +1,19 @@
inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift,SIMD_TYPE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn, MAIN_TYPE &shiftOut); inline void CONCAT(CONCAT(_vector_shift,SIMD_ENGINE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn, MAIN_TYPE &shiftOut);
inline void GEN_INTRINSIC(GEN_INTRINSIC(_vector_shift_last,SIMD_TYPE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn); inline void CONCAT(CONCAT(_vector_shift_last,SIMD_ENGINE), PRECISION) (UNION_TYPE &x, MAIN_TYPE shiftIn);
inline void GEN_INTRINSIC(GEN_INTRINSIC(precompute_masks_,SIMD_TYPE), PRECISION)(const testcase& tc, int COLS, int numMaskVecs, MASK_TYPE (*maskArr)[NUM_DISTINCT_CHARS]); inline void CONCAT(CONCAT(precompute_masks_,SIMD_ENGINE), PRECISION)(const testcase& tc, int COLS, int numMaskVecs, MASK_TYPE (*maskArr)[NUM_DISTINCT_CHARS]);
inline void GEN_INTRINSIC(GEN_INTRINSIC(init_masks_for_row_,SIMD_TYPE), PRECISION)(const testcase& tc, char* rsArr, MASK_TYPE* lastMaskShiftOut, int beginRowIndex, int numRowsToProcess); inline void CONCAT(CONCAT(init_masks_for_row_,SIMD_ENGINE), PRECISION)(const testcase& tc, char* rsArr, MASK_TYPE* lastMaskShiftOut, int beginRowIndex, int numRowsToProcess);
inline void GEN_INTRINSIC(GEN_INTRINSIC(update_masks_for_cols_,SIMD_TYPE), PRECISION)(int maskIndex, MASK_VEC& currMaskVecLow, MASK_VEC& currMaskVecHigh, MASK_TYPE (*maskArr) [NUM_DISTINCT_CHARS], char* rsArr, MASK_TYPE* lastMaskShiftOut, MASK_TYPE maskBitCnt); inline void CONCAT(CONCAT(update_masks_for_cols_,SIMD_ENGINE), PRECISION)(int maskIndex, MASK_VEC& currMaskVecLow, MASK_VEC& currMaskVecHigh, MASK_TYPE (*maskArr) [NUM_DISTINCT_CHARS], char* rsArr, MASK_TYPE* lastMaskShiftOut, MASK_TYPE maskBitCnt);
inline void GEN_INTRINSIC(GEN_INTRINSIC(computeDistVec,SIMD_TYPE), PRECISION) (MASK_VEC& currMaskVecLow, MASK_VEC& currMaskVecHigh, _256_TYPE& distm, _256_TYPE& _1_distm, _256_TYPE& distmChosen); inline void CONCAT(CONCAT(computeDistVec,SIMD_ENGINE), PRECISION) (MASK_VEC& currMaskVecLow, MASK_VEC& currMaskVecHigh, SIMD_TYPE& distm, SIMD_TYPE& _1_distm, SIMD_TYPE& distmChosen);
template<class NUMBER> inline void GEN_INTRINSIC(GEN_INTRINSIC(initializeVectors,SIMD_TYPE), PRECISION)(int ROWS, int COLS, NUMBER* shiftOutM, NUMBER *shiftOutX, NUMBER *shiftOutY, Context<NUMBER> ctx, testcase *tc, _256_TYPE *p_MM, _256_TYPE *p_GAPM, _256_TYPE *p_MX, _256_TYPE *p_XX, _256_TYPE *p_MY, _256_TYPE *p_YY, _256_TYPE *distm1D); template<class NUMBER> inline void CONCAT(CONCAT(initializeVectors,SIMD_ENGINE), PRECISION)(int ROWS, int COLS, NUMBER* shiftOutM, NUMBER *shiftOutX, NUMBER *shiftOutY, Context<NUMBER> ctx, testcase *tc, SIMD_TYPE *p_MM, SIMD_TYPE *p_GAPM, SIMD_TYPE *p_MX, SIMD_TYPE *p_XX, SIMD_TYPE *p_MY, SIMD_TYPE *p_YY, SIMD_TYPE *distm1D);
template<class NUMBER> inline void GEN_INTRINSIC(GEN_INTRINSIC(stripINITIALIZATION,SIMD_TYPE), PRECISION)( template<class NUMBER> inline void CONCAT(CONCAT(stripINITIALIZATION,SIMD_ENGINE), PRECISION)(
int stripIdx, Context<NUMBER> ctx, testcase *tc, _256_TYPE &pGAPM, _256_TYPE &pMM, _256_TYPE &pMX, _256_TYPE &pXX, _256_TYPE &pMY, _256_TYPE &pYY, int stripIdx, Context<NUMBER> ctx, testcase *tc, SIMD_TYPE &pGAPM, SIMD_TYPE &pMM, SIMD_TYPE &pMX, SIMD_TYPE &pXX, SIMD_TYPE &pMY, SIMD_TYPE &pYY,
_256_TYPE &rs, UNION_TYPE &rsN, _256_TYPE &distm, _256_TYPE &_1_distm, _256_TYPE *distm1D, _256_TYPE N_packed256, _256_TYPE *p_MM , _256_TYPE *p_GAPM , SIMD_TYPE &rs, UNION_TYPE &rsN, SIMD_TYPE &distm, SIMD_TYPE &_1_distm, SIMD_TYPE *distm1D, SIMD_TYPE N_packed256, SIMD_TYPE *p_MM , SIMD_TYPE *p_GAPM ,
_256_TYPE *p_MX, _256_TYPE *p_XX , _256_TYPE *p_MY, _256_TYPE *p_YY, UNION_TYPE &M_t_2, UNION_TYPE &X_t_2, UNION_TYPE &M_t_1, UNION_TYPE &X_t_1, SIMD_TYPE *p_MX, SIMD_TYPE *p_XX , SIMD_TYPE *p_MY, SIMD_TYPE *p_YY, UNION_TYPE &M_t_2, UNION_TYPE &X_t_2, UNION_TYPE &M_t_1, UNION_TYPE &X_t_1,
UNION_TYPE &Y_t_2, UNION_TYPE &Y_t_1, UNION_TYPE &M_t_1_y, NUMBER* shiftOutX, NUMBER* shiftOutM); UNION_TYPE &Y_t_2, UNION_TYPE &Y_t_1, UNION_TYPE &M_t_1_y, NUMBER* shiftOutX, NUMBER* shiftOutM);
inline _256_TYPE GEN_INTRINSIC(GEN_INTRINSIC(computeDISTM,SIMD_TYPE), PRECISION)(int d, int COLS, testcase * tc, HAP_TYPE &hap, _256_TYPE rs, UNION_TYPE rsN, _256_TYPE N_packed256, inline SIMD_TYPE CONCAT(CONCAT(computeDISTM,SIMD_ENGINE), PRECISION)(int d, int COLS, testcase * tc, HAP_TYPE &hap, SIMD_TYPE rs, UNION_TYPE rsN, SIMD_TYPE N_packed256,
_256_TYPE distm, _256_TYPE _1_distm); SIMD_TYPE distm, SIMD_TYPE _1_distm);
inline void GEN_INTRINSIC(GEN_INTRINSIC(computeMXY,SIMD_TYPE), PRECISION)(UNION_TYPE &M_t, UNION_TYPE &X_t, UNION_TYPE &Y_t, UNION_TYPE &M_t_y, inline void CONCAT(CONCAT(computeMXY,SIMD_ENGINE), PRECISION)(UNION_TYPE &M_t, UNION_TYPE &X_t, UNION_TYPE &Y_t, UNION_TYPE &M_t_y,
UNION_TYPE M_t_2, UNION_TYPE X_t_2, UNION_TYPE Y_t_2, UNION_TYPE M_t_1, UNION_TYPE X_t_1, UNION_TYPE M_t_1_y, UNION_TYPE Y_t_1, UNION_TYPE M_t_2, UNION_TYPE X_t_2, UNION_TYPE Y_t_2, UNION_TYPE M_t_1, UNION_TYPE X_t_1, UNION_TYPE M_t_1_y, UNION_TYPE Y_t_1,
_256_TYPE pMM, _256_TYPE pGAPM, _256_TYPE pMX, _256_TYPE pXX, _256_TYPE pMY, _256_TYPE pYY, _256_TYPE distmSel); SIMD_TYPE pMM, SIMD_TYPE pGAPM, SIMD_TYPE pMX, SIMD_TYPE pXX, SIMD_TYPE pMY, SIMD_TYPE pYY, SIMD_TYPE distmSel);
template<class NUMBER> NUMBER GEN_INTRINSIC(GEN_INTRINSIC(compute_full_prob_,SIMD_TYPE), PRECISION) (testcase *tc, NUMBER *before_last_log = NULL); template<class NUMBER> NUMBER CONCAT(CONCAT(compute_full_prob_,SIMD_ENGINE), PRECISION) (testcase *tc, NUMBER *before_last_log = NULL);

View File

@ -272,16 +272,16 @@
<!-- Comment out the following lines to build the GATK without a network connection, assuming you have all of the libraries cached already --> <!-- Comment out the following lines to build the GATK without a network connection, assuming you have all of the libraries cached already -->
<!--<get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/${ivy.jar.file}"--> <get src="http://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/${ivy.jar.file}"
<!--dest="${ivy.jar.dir}/${ivy.jar.file}"--> dest="${ivy.jar.dir}/${ivy.jar.file}"
<!--usetimestamp="true"/>--> usetimestamp="true"/>
<taskdef resource="org/apache/ivy/ant/antlib.xml" <taskdef resource="org/apache/ivy/ant/antlib.xml"
uri="antlib:org.apache.ivy.ant" uri="antlib:org.apache.ivy.ant"
classpath="${ivy.jar.dir}/${ivy.jar.file}"/> classpath="${ivy.jar.dir}/${ivy.jar.file}"/>
<!--<get src="http://repo1.maven.org/maven2/org/apache/maven/maven-ant-tasks/${maven-ant-tasks.install.version}/${maven-ant-tasks.jar.file}"--> <get src="http://repo1.maven.org/maven2/org/apache/maven/maven-ant-tasks/${maven-ant-tasks.install.version}/${maven-ant-tasks.jar.file}"
<!--dest="${ivy.jar.dir}/${maven-ant-tasks.jar.file}"--> dest="${ivy.jar.dir}/${maven-ant-tasks.jar.file}"
<!--usetimestamp="true"/>--> usetimestamp="true"/>
<taskdef resource="org/apache/maven/artifact/ant/antlib.xml" <taskdef resource="org/apache/maven/artifact/ant/antlib.xml"
uri="antlib:antlib:org.apache.maven.artifact.ant" uri="antlib:antlib:org.apache.maven.artifact.ant"
classpath="${ivy.jar.dir}/${maven-ant-tasks.jar.file}"/> classpath="${ivy.jar.dir}/${maven-ant-tasks.jar.file}"/>