Работа с скалярными и регулярными векторными типами
void ScalarArbbTypesTest()
{
f32 pi = 3.14f;
float _pi = value(pi);
printf("%f\n", _pi);
}
void DenseArbbTypesTest()
{
dense<i32> a(3);
int n = value(a.length());
printf("size = %i\n", n);
for (int i = 0; i < n; i++)
{
a[i] = i32(i + 1);
printf("%i\n", value(a[i]));
}
}
void BindArbbTest()
{
int n = 5;
double *a;
dense<f64> b;
a = new double[n];
for (int i = 0; i < n; i++)
{
a[i] = double(i + 1);
}
bind(b, a, n);
for (int i = 0; i < value(b.length()); i++)
{
printf("%f\n", value(b[i]));
}
delete []a;
}
Пример покомпонентного суммирования векторов
void ArbbVecSum(dense<f32> a, dense<f32> b, dense<f32> &c)
{
c = a + b;
}
void ArbbVecSumTest()
{
float *a, *b;
dense<f32> va, vb, vc;
int n = 5;
a = new float[n];
b = new float[n];
for (int i = 0; i < n; i++)
{
a[i] = i + 1;
b[i] = i + 1;
}
bind(va, a, n);
bind(vb, b, n);
call(ArbbVecSum)(va, vb, vc);
for (int i = 0; i < n; i++)
{
printf("%f\n", value(vc[i]));
}
delete []a;
delete []b;
}
Пример умножения плотной матрицы на вектор
void arbbMultiplication(const dense<f64> &A, const dense<f64> &x, dense<f64> &b)
{
usize n = x.length();
dense<f64> row, multi;
_for (usize i = 0, i < n, i++)
{
row = section(A, i * n, n);
multi = row * x;
b[i] = add_reduce(multi);
} _end_for;
}
void Multiplication(double *A, double *x, int n, double *b)
{
dense<f64> A_arbb, x_arbb, b_arbb;
bind(A_arbb, A, n * n);
bind(x_arbb, x, n);
bind(b_arbb, b, n);
try
{
call(arbbMultiplication)(A_arbb, x_arbb, b_arbb);
}
catch (const std::exception& e)
{
printf("%s\n", e.what());
}
catch (...)
{
printf("Unknown error\n");
}
}
Тесты для некоторых операторов
void TestIndexOperator()
{
int n = 5;
int *vval = new int[n];
size_t *colptr = new size_t[n + 1];
dense<i32> vval_arbb;
dense<usize> colptr_arbb;
for (int i = 0; i < n; i++)
{
vval[i] = i + 1;
}
colptr[0] = 0;
colptr[1] = 1;
colptr[2] = 4;
bind(vval_arbb, vval, n);
bind(colptr_arbb, colptr, n + 1);
dense<i32> vval_new = vval_arbb[colptr_arbb];
for (int i = 0; i < value(vval_new.length()); i++)
{
printf("%i\n", value(vval_new[i]));
}
delete []vval;
delete []colptr;
}
void TestShiftOperator()
{
int n = 5;
size_t *colptr = new size_t[n + 1];
dense<usize> colptr_arbb;
colptr[0] = 0;
colptr[1] = 1;
colptr[2] = 4;
colptr[3] = 6;
colptr[4] = 7;
colptr[5] = 9;
bind(colptr_arbb, colptr, n + 1);
dense<i32> shift_colptr = shift(colptr_arbb, -1, 0); // -1 - сдвиг влево на 1, 0 - заполнитель
for (int i = 0; i < value(shift_colptr.length()); i++)
{
printf("%i\n", value(shift_colptr[i]));
}
delete []colptr;
}
void TestRepeatOperator()
{
int n = 5;
int *vval = new int[n + 1];
size_t *colptr = new size_t[n + 1];
size_t *diff = new size_t[n + 1];
dense<i32> vval_arbb;
dense<usize> colptr_arbb;
for (int i = 0; i < n; i++)
{
vval[i] = i + 1;
}
vval[n] = 0;
colptr[0] = 0;
colptr[1] = 1;
colptr[2] = 4;
colptr[3] = 6;
colptr[4] = 7;
colptr[5] = 9;
bind(vval_arbb, vval, n + 1);
bind(colptr_arbb, colptr, n + 1);
dense<usize> shift_colptr = shift(colptr_arbb, 1, 0);
dense<usize> diff_arbb = colptr_arbb - shift_colptr;
diff_arbb = shift(diff_arbb, -1, 0);
dense<i32> vvalnew_arbb = repeat(vval_arbb, diff_arbb);
for (int i = 0; i < value(vvalnew_arbb.length()); i++)
{
printf("%i\n", value(vvalnew_arbb[i]));
}
delete []vval;
delete []colptr;
delete []diff;
}
void TestReshapeNestedOffsets()
{
int n = 9;
int *a = new int[n];
size_t *rowidx = new size_t[n - 4];
a[0] = 2; rowidx[0] = 0;
a[1] = 2; rowidx[1] = 1;
a[2] = 10; rowidx[2] = 4;
a[3] = 14; rowidx[3] = 7;
a[4] = 9; rowidx[4] = 8; //last index in array a
a[5] = 27;
a[6] = 16;
a[7] = 30;
a[8] = 30; // copy of the last element
dense<i32> a_arbb;
dense<usize> rowidx_arbb;
bind(a_arbb, a, n);
bind(rowidx_arbb, rowidx, n - 4);
// [2] [2 10 14] [9 27 16] [30] ([30] - last block is separated)
nested<i32> prod = reshape_nested_offsets(a_arbb, rowidx_arbb);
dense<i32> sum = add_reduce(prod);
for (int i = 0; i < value(sum.length()); i++)
{
printf("%i\n", value(sum[i]));
}
delete []a;
delete []rowidx;
}
void TestGatherOperator()
{
int n = 3;
dense<i32> res_arbb, vec_arbb, rows_arbb;
int *vec = new int[n];
int rows[] = {0, 2, 0, 1, 2}; // indeces of elements in array vec
for (int i = 0; i < n; i++)
{
vec[i] = i + 1;
}
bind(vec_arbb, vec, n); // [1 2 3]
bind(rows_arbb, rows, 5); // [0 2 0 1 2]
// create a dense that contains elements with indeces row
res_arbb = gather(vec_arbb, rows_arbb); // [1 3 1 2 3]
for (int i = 0; i < value(res_arbb.length()); i++)
{
printf("%i\n", value(res_arbb[i]));
}
delete []vec;
}