diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2769f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +myexp +**/*.o +**/*.swp diff --git a/part1/vectorOP.cpp b/part1/vectorOP.cpp index e3f943a..76dc0f4 100644 --- a/part1/vectorOP.cpp +++ b/part1/vectorOP.cpp @@ -49,8 +49,63 @@ void clampedExpVector(float *values, int *exponents, float *output, int N) // Your solution should work for any value of // N and VECTOR_WIDTH, not just when VECTOR_WIDTH divides N // + __pp_vec_float x; + __pp_vec_int y; + __pp_vec_float result; + __pp_vec_int zero = _pp_vset_int(0); + __pp_vec_float cap = _pp_vset_float(9.999999f); + __pp_vec_int one = _pp_vset_int(1); + __pp_mask maskAll, maskNonZero, maskGreater; + maskAll = _pp_init_ones(); + for (int i = 0; i < N; i += VECTOR_WIDTH) { + if (i + VECTOR_WIDTH > N) { + float *tmp = new float[VECTOR_WIDTH]; + for (int j = 0; i + j < N; j++) + tmp[j] = values[i+j]; + for (int j = N; j < i + VECTOR_WIDTH; j++) + tmp[j] = 0; + _pp_vload_float(x, tmp, maskAll); + delete []tmp; + } else { + _pp_vload_float(x, values + i, maskAll); // x = values[i]; + } + + if (i + VECTOR_WIDTH > N) { + int *tmp = new int[VECTOR_WIDTH]; + for (int j = 0; i + j < N; j++) + tmp[j] = exponents[i+j]; + for (int j = N; j < i + VECTOR_WIDTH; j++) + tmp[j] = 0; + _pp_vload_int(y, tmp, maskAll); + delete []tmp; + } else { + _pp_vload_int(y, exponents + i, maskAll); // y = exponents[i]; + } + + _pp_vset_float(result, 1.f, maskAll); + maskNonZero = _pp_init_ones(); + while (_pp_cntbits(maskNonZero) > 0) { + _pp_veq_int(maskNonZero, y, zero, maskAll); + maskNonZero = _pp_mask_not(maskNonZero); + + _pp_vmult_float(result, result, x, maskNonZero); + _pp_vsub_int(y, y, one, maskNonZero); + } + + _pp_vgt_float(maskGreater, result, cap, maskAll); + _pp_vset_float(result, 9.999999f, maskGreater); + + if (i + VECTOR_WIDTH > N) { + float *tmp = new float[VECTOR_WIDTH]; + _pp_vstore_float(output + i, result, maskAll); + for (int j = 0; i + j < N; j++) + output[i+j] = tmp[j]; + delete []tmp; + } else { + _pp_vstore_float(output + i, result, maskAll); + } } } @@ -63,10 +118,25 @@ float arraySumVector(float *values, int N) // // PP STUDENTS TODO: Implement your vectorized version of arraySumSerial here // + __pp_vec_float x; + __pp_mask maskAll; + maskAll = _pp_init_ones(); + float total = 0.f; for (int i = 0; i < N; i += VECTOR_WIDTH) { + _pp_vload_float(x, values + i, maskAll); + + for (int n = VECTOR_WIDTH; n > 1; n >>= 1) { + _pp_hadd_float(x, x); + _pp_interleave_float(x, x); + } + + float *tmp = new float[VECTOR_WIDTH]; + _pp_vstore_float(tmp, x, maskAll); + total += tmp[0]; + delete []tmp; } - return 0.0; -} \ No newline at end of file + return total; +}