feat: part1 code done
This commit is contained in:
1 parent
f9ee622fb8
commit
cfdf11ac7c
2 files changed
+74
-1
No files matched your search
@@ -0,0 +1,3 @@
|
|||||||
|
myexp
|
||||||
|
**/*.o
|
||||||
|
**/*.swp
|
||||||
+71
-1
@@ -49,8 +49,63 @@ void clampedExpVector(float *values, int *exponents, float *output, int N)
|
|||||||
// Your solution should work for any value of
|
// Your solution should work for any value of
|
||||||
// N and VECTOR_WIDTH, not just when VECTOR_WIDTH divides N
|
// 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)
|
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 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)
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0.0;
|
float *tmp = new float[VECTOR_WIDTH];
|
||||||
|
_pp_vstore_float(tmp, x, maskAll);
|
||||||
|
total += tmp[0];
|
||||||
|
delete []tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user