17int main (
int argc,
char** argv) {
19 if (argc != 2)
PUT_ERR(
"wrong number of arguments");
25 double weights[TGT_COUNT][SRC_COUNT] =
26 {{0.0,0.1,0.0,0.3,0.0,0.0,0.2,0.0,0.4,0.0},
27 {0.0,0.0,0.0,0.0,0.5,0.5,0.0,0.0,0.0,0.0},
28 {0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1},
29 {0.2,0.0,0.2,0.0,0.2,0.0,0.2,0.0,0.2,0.0},
30 {0.0,0.3,0.0,0.0,0.3,0.0,0.0,0.4,0.0,0.0}};
34 for (
size_t i = 0;
i < SRC_COUNT; ++
i) src_field[i] = (
double)(
i+1);
37 double ref_tgt_field[TGT_COUNT];
38 for (
size_t i = 0;
i < TGT_COUNT; ++
i) {
39 double tgt_value = 0.0;
40 for (
size_t j = 0; j < SRC_COUNT; ++j)
41 tgt_value += src_field[j] * weights[i][j];
42 ref_tgt_field[
i] = tgt_value;
45#ifdef YAC_OPENMP_ENABLED
46 int ref_num_threads = atoi(argv[1]);
51 size_t prefix_num_src_per_tgt[TGT_COUNT + 1];
52 size_t src_idx[SRC_COUNT * TGT_COUNT];
53 double compact_weights[SRC_COUNT * TGT_COUNT];
56 prefix_num_src_per_tgt[0] = 0;
57 for (
size_t i = 0, k = 0;
i < TGT_COUNT; ++
i) {
58 for (
size_t j = 0; j < SRC_COUNT; ++j) {
59 if (weights[i][j] != 0.0) {
65 prefix_num_src_per_tgt[
i+1] = k;
73 for (
size_t i = 0;
i < TGT_COUNT; ++
i) {
74#ifdef YAC_OPENMP_ENABLED
75 if (omp_get_num_threads() != ref_num_threads)
76 PUT_ERR(
"wrong number of threads");
78 double tgt_value = 0.0;
79 size_t const j_bound = prefix_num_src_per_tgt[
i+1];
80 for (
size_t j = prefix_num_src_per_tgt[i]; j < j_bound; ++j) {
81 tgt_value +=
src_field[src_idx[j]] * compact_weights[j];
88 for (
size_t i = 0;
i < TGT_COUNT; ++
i)
89 if (fabs(ref_tgt_field[i] - tgt_field[i]) > 1.0e-6)
90 PUT_ERR(
"wrong tgt_field value");