diff options
| author | Tomáš Jusko | 2023-09-30 00:05:11 +0200 |
|---|---|---|
| committer | Tomáš Jusko | 2023-09-30 00:05:11 +0200 |
| commit | 4b585447ce4bcfaef49123ce4630a5a85b3a16e0 (patch) | |
| tree | 5f9a341c2ab576063df5d35687082971ea37100c | |
| parent | 9094d16a62de9ca48141f5c447cc5771c7c1a4cd (diff) | |
| download | pyecsca-4b585447ce4bcfaef49123ce4630a5a85b3a16e0.tar.gz pyecsca-4b585447ce4bcfaef49123ce4630a5a85b3a16e0.tar.zst pyecsca-4b585447ce4bcfaef49123ce4630a5a85b3a16e0.zip | |
fix: Fixed GPU Pearson corr coefficient
| -rw-r--r-- | pyecsca/sca/stacked_traces/correlate.py | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/pyecsca/sca/stacked_traces/correlate.py b/pyecsca/sca/stacked_traces/correlate.py index 862e664..bac9f7e 100644 --- a/pyecsca/sca/stacked_traces/correlate.py +++ b/pyecsca/sca/stacked_traces/correlate.py @@ -4,7 +4,7 @@ from numba import cuda from numba.cuda.cudadrv.devicearray import DeviceNDArray from math import sqrt from typing import List, Optional, Union -from .combine import GPUTraceManager +from .combine import InputType, GPUTraceManager from .stacked_traces import StackedTraces from ..trace.trace import CombinedTrace @@ -28,14 +28,17 @@ def gpu_pearson_corr(intermediate_values: npt.NDArray[np.number], intermed_sum: np.number = np.sum(intermediate_values) intermed_sq_sum: np.number = np.sum(np.square(intermediate_values)) + inputs: List[InputType] = [intermediate_values, + np.array([intermed_sum]), + np.array([intermed_sq_sum])] return trace_manager.run( _gpu_pearson_corr, - [intermediate_values, [intermed_sum], [intermed_sq_sum]] + inputs ) -@cuda.jit(device=True, cache=True) +@cuda.jit(cache=True) def _gpu_pearson_corr(samples: DeviceNDArray, intermediate_values: DeviceNDArray, intermed_sum: DeviceNDArray, @@ -66,8 +69,8 @@ def _gpu_pearson_corr(samples: DeviceNDArray, samples_sq_sum += samples[row, col] ** 2 product_sum += samples[row, col] * intermediate_values[row] - numerator = n * product_sum - samples_sum * intermed_sum - denominator = (sqrt(n * samples_sq_sum - samples_sum ** 2) - * sqrt(n * intermed_sq_sum[0] - intermed_sum[0] ** 2)) + numerator = float(n) * product_sum - samples_sum * intermed_sum[0] + denominator = (sqrt(float(n) * samples_sq_sum - samples_sum ** 2) + * sqrt(float(n) * intermed_sq_sum[0] - intermed_sum[0] ** 2)) result[col] = numerator / denominator |
