CandidateVectorSearch 1.7.2
Searching for peptide candidates using sparse matrix + matrix/vector multiplication.
Loading...
Searching...
No Matches
Cuda.cs
Go to the documentation of this file.
1using System.Diagnostics;
2using System.Runtime.InteropServices;
3
5{
6 public partial class DataLoader
7 {
8 const string dllCuda = @"VectorSearchCuda.dll";
9 [DllImport(dllCuda, CallingConvention = CallingConvention.Cdecl)]
10 private static extern IntPtr findTopCandidatesCuda(IntPtr cR, IntPtr cI,
11 IntPtr sV, IntPtr sI,
12 int cRL, int cNNZ,
13 int sVL, int sIL,
14 int n, float tolerance,
15 bool normalize, bool gaussianTol,
16 int verbose);
17
18 [DllImport(dllCuda, CallingConvention = CallingConvention.Cdecl)]
19 private static extern IntPtr findTopCandidatesCudaBatched(IntPtr cR, IntPtr cI,
20 IntPtr sV, IntPtr sI,
21 int cRL, int cNNZ,
22 int sVL, int sIL,
23 int n, float tolerance,
24 bool normalize, bool gaussianTol,
25 int batchSize,
26 int verbose);
27
28 [DllImport(dllCuda, CallingConvention = CallingConvention.Cdecl)]
29 private static extern IntPtr findTopCandidatesCudaBatched2(IntPtr cR, IntPtr cI,
30 IntPtr sV, IntPtr sI,
31 int cRL, int cNNZ,
32 int sVL, int sIL,
33 int n, float tolerance,
34 bool normalize, bool gaussianTol,
35 int batchSize,
36 int verbose);
37
38 [DllImport(dllCuda, CallingConvention = CallingConvention.Cdecl)]
39 private static extern int releaseMemoryCuda(IntPtr result);
40
52 public static int Cuda(int nrCandidates, int nrSpectra, int topN, int batchSize, Random r, bool batched, int batchMode)
53 {
54 // generate candidate vectors
55 var csrRowoffsets = new int[nrCandidates + 1];
56 var csrIdx = new int[nrCandidates * 100];
57 var currentIdx = 0;
58 for (int i = 0; i < csrIdx.Length; i += 100)
59 {
60 csrRowoffsets[currentIdx] = i;
61 var tmpIdx = new int[100];
62 for (int j = 0; j < tmpIdx.Length; j++)
63 {
64 var val = r.Next(ENCODING_SIZE);
65 while (Array.Exists(tmpIdx, x => x == val))
66 {
67 val = r.Next(ENCODING_SIZE);
68 }
69 tmpIdx[j] = val;
70 }
71 Array.Sort(tmpIdx);
72 for (int j = 0; j < tmpIdx.Length; j++)
73 {
74 csrIdx[i + j] = tmpIdx[j];
75 }
76 currentIdx++;
77 if (currentIdx % 5000 == 0)
78 {
79 Console.WriteLine($"Generated {currentIdx} candidates...");
80 }
81 }
82 // add the end of matrix as specified in CSR format
83 csrRowoffsets[currentIdx++] = nrCandidates * 100;
84
85 // generate spectra vectors
86 var spectraValues = new int[nrSpectra * 500];
87 var spectraIdx = new int[nrSpectra];
88 currentIdx = 0;
89 for (int i = 0; i < spectraValues.Length; i += 500)
90 {
91 spectraIdx[currentIdx] = i;
92 var tmpValues = new int[500];
93 for (int j = 0; j < tmpValues.Length; j++)
94 {
95 var val = r.Next(ENCODING_SIZE);
96 while (Array.Exists(tmpValues, x => x == val))
97 {
98 val = r.Next(ENCODING_SIZE);
99 }
100 tmpValues[j] = val;
101 }
102 Array.Sort(tmpValues);
103 for (int j = 0; j < tmpValues.Length; j++)
104 {
105 spectraValues[i + j] = tmpValues[j];
106 }
107 currentIdx++;
108 }
109
110 // time c++ call
111 var sw = Stopwatch.StartNew();
112
113 // get pointer addresses and call c++ function
114 var csrRowoffsetsLoc = GCHandle.Alloc(csrRowoffsets, GCHandleType.Pinned);
115 var csrIdxLoc = GCHandle.Alloc(csrIdx, GCHandleType.Pinned);
116 var sValuesLoc = GCHandle.Alloc(spectraValues, GCHandleType.Pinned);
117 var sIdxLoc = GCHandle.Alloc(spectraIdx, GCHandleType.Pinned);
118 var resultArray = new int[spectraIdx.Length * topN];
119 var memStat = 1;
120 try
121 {
122 if (!batched)
123 {
124 IntPtr csrRowoffsetsPtr = csrRowoffsetsLoc.AddrOfPinnedObject();
125 IntPtr csrIdxPtr = csrIdxLoc.AddrOfPinnedObject();
126 IntPtr sValuesPtr = sValuesLoc.AddrOfPinnedObject();
127 IntPtr sIdxPtr = sIdxLoc.AddrOfPinnedObject();
128
129 IntPtr result = findTopCandidatesCuda(csrRowoffsetsPtr, csrIdxPtr,
130 sValuesPtr, sIdxPtr,
131 csrRowoffsets.Length, csrIdx.Length,
132 spectraValues.Length, spectraIdx.Length,
133 topN, (float) 0.02,
134 NORMALIZE, USE_GAUSSIAN,
135 1000);
136
137 Marshal.Copy(result, resultArray, 0, spectraIdx.Length * topN);
138
139 memStat = releaseMemoryCuda(result);
140 }
141 else
142 {
143 if (batchMode == 2)
144 {
145 IntPtr csrRowoffsetsPtr = csrRowoffsetsLoc.AddrOfPinnedObject();
146 IntPtr csrIdxPtr = csrIdxLoc.AddrOfPinnedObject();
147 IntPtr sValuesPtr = sValuesLoc.AddrOfPinnedObject();
148 IntPtr sIdxPtr = sIdxLoc.AddrOfPinnedObject();
149
150 IntPtr result = findTopCandidatesCudaBatched2(csrRowoffsetsPtr, csrIdxPtr,
151 sValuesPtr, sIdxPtr,
152 csrRowoffsets.Length, csrIdx.Length,
153 spectraValues.Length, spectraIdx.Length,
154 topN, (float) 0.02,
155 NORMALIZE, USE_GAUSSIAN,
156 batchSize,
157 1000);
158
159 Marshal.Copy(result, resultArray, 0, spectraIdx.Length * topN);
160
161 memStat = releaseMemoryCuda(result);
162 }
163 else
164 {
165 IntPtr csrRowoffsetsPtr = csrRowoffsetsLoc.AddrOfPinnedObject();
166 IntPtr csrIdxPtr = csrIdxLoc.AddrOfPinnedObject();
167 IntPtr sValuesPtr = sValuesLoc.AddrOfPinnedObject();
168 IntPtr sIdxPtr = sIdxLoc.AddrOfPinnedObject();
169
170 IntPtr result = findTopCandidatesCudaBatched(csrRowoffsetsPtr, csrIdxPtr,
171 sValuesPtr, sIdxPtr,
172 csrRowoffsets.Length, csrIdx.Length,
173 spectraValues.Length, spectraIdx.Length,
174 topN, (float) 0.02,
175 NORMALIZE, USE_GAUSSIAN,
176 batchSize,
177 1000);
178
179 Marshal.Copy(result, resultArray, 0, spectraIdx.Length * topN);
180
181 memStat = releaseMemoryCuda(result);
182 }
183 }
184 }
185 catch (Exception ex)
186 {
187 Console.WriteLine("Something went wrong:");
188 Console.WriteLine(ex.ToString());
189 }
190 finally
191 {
192 if (csrRowoffsetsLoc.IsAllocated) { csrRowoffsetsLoc.Free(); }
193 if (csrIdxLoc.IsAllocated) { csrIdxLoc.Free(); }
194 if (sValuesLoc.IsAllocated) { sValuesLoc.Free(); }
195 if (sIdxLoc.IsAllocated) { sIdxLoc.Free(); }
196 }
197
198 // end time c++ call
199 sw.Stop();
200
201 for (int i = 0; i < topN; i++)
202 {
203 Console.WriteLine(resultArray[i]);
204 }
205
206 Console.WriteLine($"MemStat: {memStat}");
207 var mode = batched ? batchMode == 2 ? "(SpMM)" : "(SpGEMM)" : "(SpMV)";
208 Console.WriteLine($"Time for candidate search {mode}:");
209 Console.WriteLine(sw.Elapsed.TotalSeconds.ToString());
210
211 //
212 GC.Collect();
213 GC.WaitForPendingFinalizers();
214
215 return 0;
216 }
217 }
218}
static int Cuda(int nrCandidates, int nrSpectra, int topN, int batchSize, Random r, bool batched, int batchMode)
Wrapper for testing GPU-based matrix multiplication functions.
Definition Cuda.cs:52