-
Notifications
You must be signed in to change notification settings - Fork 3
/
findmax_ff.cu
53 lines (41 loc) · 1.76 KB
/
findmax_ff.cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
This file is part of MyoQMRI.
MyoQMRI is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Foobar is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Foobar. If not, see <https://www.gnu.org/licenses/>.
Copyright 2020 Francesco Santini <[email protected]>
*/
#include <iostream>
#include <math.h>
// cublas matrices are column-major: index = row*nCol + col. We want the maximum over the columns
extern "C" void __global__ findmax_ff(float *corrMatrix, int *ffMatrix, unsigned int nVoxels, int *ffparameters, unsigned int nParams, unsigned int *outIndexVector)
{
// corrMatrix will be nVoxelsxnParams
// ffMatrix is nVoxelsx1
// ffparameters is nParamsx1 - integer value of fat fraction in %
// outIndexVector is nVoxelsx1
const int voxelIndex = blockIdx.x*blockDim.x + threadIdx.x; // this will be the row if the corrMatrix
if (voxelIndex >= nVoxels) return;
float maxCorrVal = 0;
int maxIndex = 0;
for (int p=0; p<nParams; p++)
{
if (ffparameters[p] == ffMatrix[voxelIndex])
{
float curCorrVal = corrMatrix[voxelIndex*nParams + p];
if (curCorrVal > maxCorrVal)
{
maxCorrVal = curCorrVal;
maxIndex = p;
}
}
}
outIndexVector[voxelIndex] = maxIndex;
}