1 /*
2  * phylokernelavx.cpp
3  *
4  *  Created on: Sept 25, 2016
5  *      Author: minh
6  */
7 
8 
9 #include "vectorclass/vectormath_exp.h"
10 #include "vectorclass/vectorclass.h"
11 #include "phylokernel.h"
12 //#include "phylokernelsafe.h"
13 //#include "phylokernelmixture.h"
14 //#include "phylokernelmixrate.h"
15 //#include "phylokernelsitemodel.h"
16 
17 #include "phylokernelnew.h"
18 #include "phylokernelnonrev.h"
19 #define KERNEL_FIX_STATES
20 #include "phylokernelnew.h"
21 #include "phylokernelnonrev.h"
22 
23 
24 #if !defined ( __SSE2__ ) && !defined ( __x86_64__ )
25 #error "You must compile this file with SSE2 enabled!"
26 #endif
27 
setParsimonyKernelSSE()28 void PhyloTree::setParsimonyKernelSSE() {
29     if (cost_matrix) {
30         // Sankoff kernel
31         computeParsimonyBranchPointer = &PhyloTree::computeParsimonyBranchSankoffSIMD<Vec4ui>;
32         computePartialParsimonyPointer = &PhyloTree::computePartialParsimonySankoffSIMD<Vec4ui>;
33         return;
34     }
35     // Fitch kernel
36 	computeParsimonyBranchPointer = &PhyloTree::computeParsimonyBranchFastSIMD<Vec4ui>;
37     computePartialParsimonyPointer = &PhyloTree::computePartialParsimonyFastSIMD<Vec4ui>;
38 }
39 
setDotProductSSE()40 void PhyloTree::setDotProductSSE() {
41 #ifdef BOOT_VAL_FLOAT
42 		dotProduct = &PhyloTree::dotProductSIMD<float, Vec4f>;
43 #else
44 		dotProduct = &PhyloTree::dotProductSIMD<double, Vec2d>;
45 #endif
46         dotProductDouble = &PhyloTree::dotProductSIMD<double, Vec2d>;
47 }
48 
setLikelihoodKernelSSE()49 void PhyloTree::setLikelihoodKernelSSE() {
50     vector_size = 2;
51     bool site_model = model_factory && model_factory->model->isSiteSpecificModel();
52 
53     if (site_model && ((model_factory && !model_factory->model->isReversible()) || params->kernel_nonrev))
54         outError("Site-specific model is not yet supported for nonreversible models");
55 
56     setParsimonyKernelSSE();
57     computeLikelihoodDervMixlenPointer = NULL;
58 
59     if (site_model && safe_numeric) {
60         switch (aln->num_states) {
61         case 4:
62             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, SAFE_LH, 4, false, true>;
63             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, SAFE_LH, 4, false, true>;
64             computePartialLikelihoodPointer    =  &PhyloTree::computePartialLikelihoodSIMD  <Vec2d, SAFE_LH, 4, false, true>;
65             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 4, false, true>;
66             break;
67         case 20:
68             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, SAFE_LH, 20, false, true>;
69             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, SAFE_LH, 20, false, true>;
70             computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodSIMD   <Vec2d, SAFE_LH, 20, false, true>;
71             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 20, false, true>;
72             break;
73         default:
74             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchGenericSIMD    <Vec2d, SAFE_LH, false, true>;
75             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervGenericSIMD      <Vec2d, SAFE_LH, false, true>;
76             computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodGenericSIMD   <Vec2d, SAFE_LH, false, true>;
77             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferGenericSIMD<Vec2d, false, true>;
78             break;
79         }
80         return;
81     }
82 
83     if (site_model) {
84         switch (aln->num_states) {
85         case 4:
86             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, NORM_LH, 4, false, true>;
87             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, NORM_LH, 4, false, true>;
88             computePartialLikelihoodPointer    =  &PhyloTree::computePartialLikelihoodSIMD  <Vec2d, NORM_LH, 4, false, true>;
89             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 4, false, true>;
90             break;
91         case 20:
92             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, NORM_LH, 20, false, true>;
93             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, NORM_LH, 20, false, true>;
94             computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodSIMD   <Vec2d, NORM_LH, 20, false, true>;
95             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 20, false, true>;
96             break;
97         default:
98             ASSERT(0);
99             break;
100         }
101         return;
102     }
103 
104     if ((model_factory && !model_factory->model->isReversible()) || params->kernel_nonrev) {
105         // if nonreversible model
106         if (safe_numeric) {
107         switch (aln->num_states) {
108         case 4:
109             computeLikelihoodBranchPointer  = &PhyloTree::computeNonrevLikelihoodBranchSIMD <Vec2d, SAFE_LH, 4>;
110             computeLikelihoodDervPointer    = &PhyloTree::computeNonrevLikelihoodDervSIMD   <Vec2d, SAFE_LH, 4>;
111             computePartialLikelihoodPointer = &PhyloTree::computeNonrevPartialLikelihoodSIMD<Vec2d, SAFE_LH, 4>;
112             break;
113         default:
114             computeLikelihoodBranchPointer  = &PhyloTree::computeNonrevLikelihoodBranchGenericSIMD <Vec2d, SAFE_LH>;
115             computeLikelihoodDervPointer    = &PhyloTree::computeNonrevLikelihoodDervGenericSIMD   <Vec2d, SAFE_LH>;
116             computePartialLikelihoodPointer = &PhyloTree::computeNonrevPartialLikelihoodGenericSIMD<Vec2d, SAFE_LH>;
117             break;
118         }
119         } else {
120             switch (aln->num_states) {
121                 case 4:
122                     computeLikelihoodBranchPointer  = &PhyloTree::computeNonrevLikelihoodBranchSIMD <Vec2d, NORM_LH, 4>;
123                     computeLikelihoodDervPointer    = &PhyloTree::computeNonrevLikelihoodDervSIMD   <Vec2d, NORM_LH, 4>;
124                     computePartialLikelihoodPointer = &PhyloTree::computeNonrevPartialLikelihoodSIMD<Vec2d, NORM_LH, 4>;
125                     break;
126                 default:
127                     computeLikelihoodBranchPointer  = &PhyloTree::computeNonrevLikelihoodBranchGenericSIMD <Vec2d, NORM_LH>;
128                     computeLikelihoodDervPointer    = &PhyloTree::computeNonrevLikelihoodDervGenericSIMD   <Vec2d, NORM_LH>;
129                     computePartialLikelihoodPointer = &PhyloTree::computeNonrevPartialLikelihoodGenericSIMD<Vec2d, NORM_LH>;
130                     break;
131             }
132         }
133         computeLikelihoodFromBufferPointer = NULL;
134         return;
135     }
136 
137     if (safe_numeric) {
138 	switch(aln->num_states) {
139         case 4:
140             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, SAFE_LH, 4>;
141             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, SAFE_LH, 4>;
142             computeLikelihoodDervMixlenPointer = &PhyloTree::computeLikelihoodDervMixlenSIMD<Vec2d, SAFE_LH, 4>;
143             computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodSIMD   <Vec2d, SAFE_LH, 4>;
144             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 4>;
145             break;
146         case 20:
147             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, SAFE_LH, 20>;
148             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, SAFE_LH, 20>;
149             computeLikelihoodDervMixlenPointer = &PhyloTree::computeLikelihoodDervMixlenSIMD<Vec2d, SAFE_LH, 20>;
150             computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodSIMD   <Vec2d, SAFE_LH, 20>;
151             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 20>;
152             break;
153         default:
154             computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchGenericSIMD    <Vec2d, SAFE_LH>;
155             computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervGenericSIMD      <Vec2d, SAFE_LH>;
156             computeLikelihoodDervMixlenPointer = &PhyloTree::computeLikelihoodDervMixlenGenericSIMD<Vec2d, SAFE_LH>;
157             computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodGenericSIMD   <Vec2d, SAFE_LH>;
158             computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferGenericSIMD<Vec2d>;
159             break;
160         }
161         return;
162     }
163 
164 	switch(aln->num_states) {
165 	case 4:
166         computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, NORM_LH, 4>;
167         computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, NORM_LH, 4>;
168         computeLikelihoodDervMixlenPointer = &PhyloTree::computeLikelihoodDervMixlenSIMD<Vec2d, NORM_LH, 4>;
169         computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodSIMD   <Vec2d, NORM_LH, 4>;
170         computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 4>;
171 		break;
172 	case 20:
173         computeLikelihoodBranchPointer     = &PhyloTree::computeLikelihoodBranchSIMD    <Vec2d, NORM_LH, 20>;
174         computeLikelihoodDervPointer       = &PhyloTree::computeLikelihoodDervSIMD      <Vec2d, NORM_LH, 20>;
175         computeLikelihoodDervMixlenPointer = &PhyloTree::computeLikelihoodDervMixlenSIMD<Vec2d, NORM_LH, 20>;
176         computePartialLikelihoodPointer    = &PhyloTree::computePartialLikelihoodSIMD   <Vec2d, NORM_LH, 20>;
177         computeLikelihoodFromBufferPointer = &PhyloTree::computeLikelihoodFromBufferSIMD<Vec2d, 20>;
178 		break;
179 	default:
180         ASSERT(0);
181 		break;
182 	}
183 }
184 
185