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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
/*
Copyright (c) 2012-2023, Intel Corporation
SPDX-License-Identifier: BSD-3-Clause
*/
/**************************************************************\
| General
\**************************************************************/
export void zero (uniform double data[],
uniform int size)
{
foreach (i = 0 ... size)
data[i] = 0.0;
}
/**************************************************************\
| Vector helpers
\**************************************************************/
export void vector_add (uniform double a[],
const uniform double b[],
const uniform int size)
{
foreach (i = 0 ... size)
a[i] += b[i];
}
export void vector_sub (uniform double a[],
const uniform double b[],
const uniform int size)
{
foreach (i = 0 ... size)
a[i] -= b[i];
}
export void vector_mult (uniform double a[],
const uniform double b,
const uniform int size)
{
foreach (i = 0 ... size)
a[i] *= b;
}
export void vector_div (uniform double a[],
const uniform double b,
const uniform int size)
{
foreach (i = 0 ... size)
a[i] /= b;
}
export void vector_add_ax (uniform double r[],
const uniform double a,
const uniform double x[],
const uniform int size)
{
foreach (i = 0 ... size)
r[i] += a * x[i];
}
export uniform double vector_dot (const uniform double a[],
const uniform double b[],
const uniform int size)
{
varying double sum = 0.0;
foreach (i = 0 ... size)
sum += a[i] * b[i];
return reduce_add(sum);
}
/**************************************************************\
| Matrix helpers
\**************************************************************/
export void sparse_multiply (const uniform double entries[],
const uniform double columns[],
const uniform double row_offsets[],
const uniform int rows,
const uniform int cols,
const uniform int nonzeroes,
const uniform double v[],
uniform double r[])
{
foreach (row = 0 ... rows) {
int row_offset = row_offsets[row];
int next_offset = ((row + 1 == rows) ? nonzeroes : row_offsets[row+1]);
double sum = 0;
for (int j = row_offset; j < next_offset; j++) {
#pragma ignore warning(perf)
sum += v[columns[j]] * entries[j];
}
r[row] = sum;
}
}
|