CandidateVectorSearch 1.7.2
Searching for peptide candidates using sparse matrix + matrix/vector multiplication.
Loading...
Searching...
No Matches
Benchmark.cs
Go to the documentation of this file.
1using System.Diagnostics;
2using System.Runtime.InteropServices;
3
5{
6 public partial class DataLoader
7 {
17 public static int Benchmark(int nrCandidates, int nrSpectra, int topN, int batchSize, Random r)
18 {
19 // generate candidate vectors
20 var candidateValues = new int[nrCandidates * 100];
21 var candidatesIdx = new int[nrCandidates];
22 var csrRowoffsets = new int[nrCandidates + 1];
23 var csrIdx = new int[nrCandidates * 100];
24 var currentIdx = 0;
25 for (int i = 0; i < candidateValues.Length; i += 100)
26 {
27 candidatesIdx[currentIdx] = i;
28 csrRowoffsets[currentIdx] = i;
29 var tmpValues = new int[100];
30 for (int j = 0; j < tmpValues.Length; j++)
31 {
32 var val = r.Next(ENCODING_SIZE);
33 while (Array.Exists(tmpValues, x => x == val))
34 {
35 val = r.Next(ENCODING_SIZE);
36 }
37 tmpValues[j] = val;
38 }
39 Array.Sort(tmpValues);
40 for (int j = 0; j < tmpValues.Length; j++)
41 {
42 candidateValues[i + j] = tmpValues[j];
43 csrIdx[i + j] = tmpValues[j];
44 }
45 currentIdx++;
46 if (currentIdx % 5000 == 0)
47 {
48 Console.WriteLine($"Generated {currentIdx} candidates...");
49 }
50 }
51 // add the end of matrix as specified in CSR format
52 csrRowoffsets[currentIdx++] = nrCandidates * 100;
53
54 // generate spectra vectors
55 var spectraValues = new int[nrSpectra * 500];
56 var spectraIdx = new int[nrSpectra];
57 currentIdx = 0;
58 for (int i = 0; i < spectraValues.Length; i += 500)
59 {
60 spectraIdx[currentIdx] = i;
61 var tmpValues = new int[500];
62 for (int j = 0; j < tmpValues.Length; j++)
63 {
64 var val = r.Next(ENCODING_SIZE);
65 while (Array.Exists(tmpValues, x => x == val))
66 {
67 val = r.Next(ENCODING_SIZE);
68 }
69 tmpValues[j] = val;
70 }
71 Array.Sort(tmpValues);
72 for (int j = 0; j < tmpValues.Length; j++)
73 {
74 spectraValues[i + j] = tmpValues[j];
75 }
76 currentIdx++;
77 }
78
79 // get pointer addresses and call c++ function
80 var cValuesLoc = GCHandle.Alloc(candidateValues, GCHandleType.Pinned);
81 var cIdxLoc = GCHandle.Alloc(candidatesIdx, GCHandleType.Pinned);
82 var csrRowoffsetsLoc = GCHandle.Alloc(csrRowoffsets, GCHandleType.Pinned);
83 var csrIdxLoc = GCHandle.Alloc(csrIdx, GCHandleType.Pinned);
84 var sValuesLoc = GCHandle.Alloc(spectraValues, GCHandleType.Pinned);
85 var sIdxLoc = GCHandle.Alloc(spectraIdx, GCHandleType.Pinned);
86 var resultArrayEigen = new int[spectraIdx.Length * topN];
87 var resultArrayEigenInt = new int[spectraIdx.Length * topN];
88 var resultArrayEigen2 = new int[spectraIdx.Length * topN];
89 var resultArrayEigen2Int = new int[spectraIdx.Length * topN];
90 var resultArrayEigenB = new int[spectraIdx.Length * topN];
91 var resultArrayEigenBInt = new int[spectraIdx.Length * topN];
92 var resultArrayEigenB2 = new int[spectraIdx.Length * topN];
93 var resultArrayEigenB2Int = new int[spectraIdx.Length * topN];
94 var resultArrayCuda = new int[spectraIdx.Length * topN];
95 var resultArrayCudaB = new int[spectraIdx.Length * topN];
96 var resultArrayCudaB2 = new int[spectraIdx.Length * topN];
97 var memStat = 1;
98 try
99 {
100 IntPtr cValuesPtr = cValuesLoc.AddrOfPinnedObject();
101 IntPtr cIdxPtr = cIdxLoc.AddrOfPinnedObject();
102 IntPtr csrRowoffsetsPtr = csrRowoffsetsLoc.AddrOfPinnedObject();
103 IntPtr csrIdxPtr = csrIdxLoc.AddrOfPinnedObject();
104 IntPtr sValuesPtr = sValuesLoc.AddrOfPinnedObject();
105 IntPtr sIdxPtr = sIdxLoc.AddrOfPinnedObject();
106
107 var sw1 = Stopwatch.StartNew();
108
109 IntPtr resultEigen = findTopCandidates(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
110 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
111 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, 0, 0);
112
113 Marshal.Copy(resultEigen, resultArrayEigen, 0, spectraIdx.Length * topN);
114
115 memStat = releaseMemory(resultEigen);
116
117 sw1.Stop();
118
119 Console.WriteLine("Time for candidate search Eigen SpM*SpV:");
120 Console.WriteLine(sw1.Elapsed.TotalSeconds.ToString());
121
122 var sw1Int = Stopwatch.StartNew();
123
124 IntPtr resultEigenInt = findTopCandidatesInt(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
125 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
126 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, 0, 0);
127
128 Marshal.Copy(resultEigenInt, resultArrayEigenInt, 0, spectraIdx.Length * topN);
129
130 memStat = releaseMemory(resultEigenInt);
131
132 sw1Int.Stop();
133
134 Console.WriteLine("Time for candidate search Eigen SpM*SpV (int):");
135 Console.WriteLine(sw1Int.Elapsed.TotalSeconds.ToString());
136
137 var sw2 = Stopwatch.StartNew();
138
139 IntPtr resultEigen2 = findTopCandidates2(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
140 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
141 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, 0, 0);
142
143 Marshal.Copy(resultEigen2, resultArrayEigen2, 0, spectraIdx.Length * topN);
144
145 memStat = releaseMemory(resultEigen2);
146
147 sw2.Stop();
148
149 Console.WriteLine("Time for candidate search Eigen SpM*V:");
150 Console.WriteLine(sw2.Elapsed.TotalSeconds.ToString());
151
152 var sw2Int = Stopwatch.StartNew();
153
154 IntPtr resultEigen2Int = findTopCandidates2Int(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
155 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
156 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, 0, 0);
157
158 Marshal.Copy(resultEigen2Int, resultArrayEigen2Int, 0, spectraIdx.Length * topN);
159
160 memStat = releaseMemory(resultEigen2Int);
161
162 sw2Int.Stop();
163
164 Console.WriteLine("Time for candidate search Eigen SpM*V (int):");
165 Console.WriteLine(sw2Int.Elapsed.TotalSeconds.ToString());
166
167 var sw3 = Stopwatch.StartNew();
168
169 IntPtr resultEigenB = findTopCandidatesBatched(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
170 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
171 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, batchSize, 0, 0);
172
173 Marshal.Copy(resultEigenB, resultArrayEigenB, 0, spectraIdx.Length * topN);
174
175 memStat = releaseMemory(resultEigenB);
176
177 sw3.Stop();
178
179 Console.WriteLine("Time for candidate search Eigen SpM*SpM:");
180 Console.WriteLine(sw3.Elapsed.TotalSeconds.ToString());
181
182 var sw3Int = Stopwatch.StartNew();
183
184 IntPtr resultEigenBInt = findTopCandidatesBatchedInt(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
185 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
186 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, batchSize, 0, 0);
187
188 Marshal.Copy(resultEigenBInt, resultArrayEigenBInt, 0, spectraIdx.Length * topN);
189
190 memStat = releaseMemory(resultEigenBInt);
191
192 sw3Int.Stop();
193
194 Console.WriteLine("Time for candidate search Eigen SpM*SpM (int):");
195 Console.WriteLine(sw3Int.Elapsed.TotalSeconds.ToString());
196
197 var sw4 = Stopwatch.StartNew();
198
199 IntPtr resultEigenB2 = findTopCandidatesBatched2(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
200 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
201 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, batchSize, 0, 0);
202
203 Marshal.Copy(resultEigenB2, resultArrayEigenB2, 0, spectraIdx.Length * topN);
204
205 memStat = releaseMemory(resultEigenB2);
206
207 sw4.Stop();
208
209 Console.WriteLine("Time for candidate search Eigen SpM*M:");
210 Console.WriteLine(sw4.Elapsed.TotalSeconds.ToString());
211
212 var sw4Int = Stopwatch.StartNew();
213
214 IntPtr resultEigenB2Int = findTopCandidatesBatched2Int(cValuesPtr, cIdxPtr, sValuesPtr, sIdxPtr,
215 candidateValues.Length, candidatesIdx.Length, spectraValues.Length, spectraIdx.Length,
216 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, batchSize, 0, 0);
217
218 Marshal.Copy(resultEigenB2Int, resultArrayEigenB2Int, 0, spectraIdx.Length * topN);
219
220 memStat = releaseMemory(resultEigenB2Int);
221
222 sw4Int.Stop();
223
224 Console.WriteLine("Time for candidate search Eigen SpM*M (int):");
225 Console.WriteLine(sw4Int.Elapsed.TotalSeconds.ToString());
226
227 var sw5 = Stopwatch.StartNew();
228
229 IntPtr resultCuda = findTopCandidatesCuda(csrRowoffsetsPtr, csrIdxPtr,
230 sValuesPtr, sIdxPtr,
231 csrRowoffsets.Length, csrIdx.Length,
232 spectraValues.Length, spectraIdx.Length,
233 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, 0);
234
235 Marshal.Copy(resultCuda, resultArrayCuda, 0, spectraIdx.Length * topN);
236
237 memStat = releaseMemoryCuda(resultCuda);
238
239 sw5.Stop();
240
241 Console.WriteLine("Time for candidate search Cuda SpMV:");
242 Console.WriteLine(sw5.Elapsed.TotalSeconds.ToString());
243
244 var sw6 = Stopwatch.StartNew();
245
246 IntPtr resultCudaB2 = findTopCandidatesCudaBatched2(csrRowoffsetsPtr, csrIdxPtr,
247 sValuesPtr, sIdxPtr,
248 csrRowoffsets.Length, csrIdx.Length,
249 spectraValues.Length, spectraIdx.Length,
250 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, batchSize, 0);
251
252 Marshal.Copy(resultCudaB2, resultArrayCudaB2, 0, spectraIdx.Length * topN);
253
254 memStat = releaseMemoryCuda(resultCudaB2);
255
256 sw6.Stop();
257
258 Console.WriteLine("Time for candidate search Cuda SpMM:");
259 Console.WriteLine(sw6.Elapsed.TotalSeconds.ToString());
260
261 var sw7 = Stopwatch.StartNew();
262
263 IntPtr resultCudaB = findTopCandidatesCudaBatched(csrRowoffsetsPtr, csrIdxPtr,
264 sValuesPtr, sIdxPtr,
265 csrRowoffsets.Length, csrIdx.Length,
266 spectraValues.Length, spectraIdx.Length,
267 topN, (float) 0.02, NORMALIZE, USE_GAUSSIAN, batchSize, 0);
268
269 Marshal.Copy(resultCudaB, resultArrayCudaB, 0, spectraIdx.Length * topN);
270
271 memStat = releaseMemoryCuda(resultCudaB);
272
273 sw7.Stop();
274
275 Console.WriteLine("Time for candidate search Cuda SpGEMM:");
276 Console.WriteLine(sw7.Elapsed.TotalSeconds.ToString());
277 }
278 catch (Exception ex)
279 {
280 Console.WriteLine("Something went wrong:");
281 Console.WriteLine(ex.ToString());
282 }
283 finally
284 {
285 if (cValuesLoc.IsAllocated) { cValuesLoc.Free(); }
286 if (cIdxLoc.IsAllocated) { cIdxLoc.Free(); }
287 if (csrRowoffsetsLoc.IsAllocated) { csrRowoffsetsLoc.Free(); }
288 if (csrIdxLoc.IsAllocated) { csrIdxLoc.Free(); }
289 if (sValuesLoc.IsAllocated) { sValuesLoc.Free(); }
290 if (sIdxLoc.IsAllocated) { sIdxLoc.Free(); }
291 }
292
293 Console.WriteLine($"Top 5 of the first spectrum:");
294
295 for (int i = 0; i < 5; i++)
296 {
297 Console.WriteLine($"eSpVf32: {resultArrayEigen[i]}");
298 Console.WriteLine($"eSpVi32: {resultArrayEigenInt[i]}");
299 Console.WriteLine($"eDnVf32: {resultArrayEigen2[i]}");
300 Console.WriteLine($"eDnVi32: {resultArrayEigen2Int[i]}");
301 Console.WriteLine($"eSpMf32: {resultArrayEigenB[i]}");
302 Console.WriteLine($"eSpMi32: {resultArrayEigenBInt[i]}");
303 Console.WriteLine($"eDnMf32: {resultArrayEigenB2[i]}");
304 Console.WriteLine($"eDnMi32: {resultArrayEigenB2Int[i]}");
305 Console.WriteLine($"cDnVf32: {resultArrayCuda[i]}");
306 Console.WriteLine($"cSpMf32: {resultArrayCudaB[i]}");
307 Console.WriteLine($"cDnMf32: {resultArrayCudaB2[i]}");
308 Console.WriteLine("-----");
309 }
310
311 Console.WriteLine($"Top 5 of the last spectrum:");
312
313 for (int i = spectraIdx.Length * topN - topN; i < spectraIdx.Length * topN - topN + 5; i++)
314 {
315 Console.WriteLine($"eSpVf32: {resultArrayEigen[i]}");
316 Console.WriteLine($"eSpVi32: {resultArrayEigenInt[i]}");
317 Console.WriteLine($"eDnVf32: {resultArrayEigen2[i]}");
318 Console.WriteLine($"eDnVi32: {resultArrayEigen2Int[i]}");
319 Console.WriteLine($"eSpMf32: {resultArrayEigenB[i]}");
320 Console.WriteLine($"eSpMi32: {resultArrayEigenBInt[i]}");
321 Console.WriteLine($"eDnMf32: {resultArrayEigenB2[i]}");
322 Console.WriteLine($"eDnMi32: {resultArrayEigenB2Int[i]}");
323 Console.WriteLine($"cDnVf32: {resultArrayCuda[i]}");
324 Console.WriteLine($"cSpMf32: {resultArrayCudaB[i]}");
325 Console.WriteLine($"cDnMf32: {resultArrayCudaB2[i]}");
326 Console.WriteLine("-----");
327 }
328
329 Console.WriteLine($"MemStat: {memStat}");
330
331 //
332 GC.Collect();
333 GC.WaitForPendingFinalizers();
334
335 return 0;
336 }
337 }
338}
Prototype implementation to test C++/C# marshalling and the different matrix multiplication approache...
Definition Benchmark.cs:7
static int Benchmark(int nrCandidates, int nrSpectra, int topN, int batchSize, Random r)
Function to run synthetic benchmarks of all the different matrix multiplication functions.
Definition Benchmark.cs:17