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