diff --git a/helper.h b/helper.h new file mode 100644 index 0000000..db5a3df --- /dev/null +++ b/helper.h @@ -0,0 +1,109 @@ +#ifndef HELPER +#define HELPER + +#include +#include +#include +#include +#include + +#if 0 +typedef int int32_t; +typedef long long int64_t; +#endif + +typedef unsigned int uint32_t; +typedef unsigned long long uint64_t; + +#define min(a,b) ( ((a)<(b))? (a) : (b) ) + +template +void runSeqTranspose(T* A, T* A_tr, const int heightA, const int widthA) { + #pragma omp parallel for collapse(2) + for(int ii=0; iitv_usec + resolution * t2->tv_sec) - (t1->tv_usec + resolution * t1->tv_sec); + result->tv_sec = diff / resolution; + result->tv_usec = diff % resolution; + return (diff<0); +} + +template +void randomInit(T* data, uint64_t size) { + for (uint64_t i = 0; i < size; i++) + data[i] = rand() / (T)RAND_MAX; +} + +template +void zeroInit(T* data, uint64_t size) { + #pragma omp parallel for schedule(static) + for (uint64_t i = 0; i < size; i++) + data[i] = 0; +} + +void randomInds(uint32_t* data, uint64_t size, uint32_t M) { + for (uint64_t i = 0; i < size; i++) + data[i] = rand() % M; +} + +/** + * Initialize the `data` array, which has `size` elements: + * frac% of them are NaNs and (1-frac)% are random values. + * + */ +void randomMask(char* data, uint64_t size, float frac) { + for (uint64_t i = 0; i < size; i++) { + float r = rand() / (float)RAND_MAX; + data[i] = (r >= frac) ? 1 : 0; + } +} + +// error for matmul: 0.02 +template +bool validate(T* A, T* B, const uint64_t sizeAB, const T ERR){ + for(uint64_t i = 0; i < sizeAB; i++) { + T curr_err = fabs( (A[i] - B[i]) / fmax(A[i], B[i]) ); + if (curr_err >= ERR) { + printf("INVALID RESULT at flat index %llu: %f vs %f\n", i, A[i], B[i]); + return false; + } + } + printf("VALID RESULT!\n"); + return true; +} + +template +bool validateExact(T* A, T* B, uint64_t sizeAB){ + for(uint64_t i = 0; i < sizeAB; i++) { + if ( A[i] != B[i] ) { + printf("INVALID RESULT at flat index %llu: %f vs %f\n", i, (float)A[i], (float)B[i]); + return false; + } + } + printf("VALID RESULT!\n"); + return true; +} + +#endif