void sparseCompare(array A, array B, const double eps) { // This macro is used to check if either value is finite and then call assert // If neither value is finite, then they can be assumed to be equal to either inf or nan #define ASSERT_FINITE_EQ(V1, V2) \ if(std::isfinite(V1) || std::isfinite(V2)) { \ ASSERT_NEAR(V1, V2, eps) << "at : " << i; \ } \ array AValues = sparseGetValues(A); array ARowIdx = sparseGetRowIdx(A); array AColIdx = sparseGetColIdx(A); array BValues = sparseGetValues(B); array BRowIdx = sparseGetRowIdx(B); array BColIdx = sparseGetColIdx(B); // Verify row and col indices ASSERT_EQ(0, max<int>(ARowIdx - BRowIdx)); ASSERT_EQ(0, max<int>(AColIdx - BColIdx)); T *ptrA = AValues.host<T>(); T *ptrB = BValues.host<T>(); for(int i = 0; i < AValues.elements(); i++) { ASSERT_FINITE_EQ(real(ptrA[i]), real(ptrB[i])); if(A.iscomplex()) { ASSERT_FINITE_EQ(imag(ptrA[i]), imag(ptrB[i])); } } freeHost(ptrA); freeHost(ptrB); #undef ASSERT_FINITE_EQ }
TEST(JIT, CPP_JIT_HASH) { const int num = 20; const float valA = 3; const float valB = 5; const float valC = 2; const float valD = valA + valB; const float valE = valA + valC; const float valF1 = valD * valE - valE; const float valF2 = valD * valE - valD; array a = constant(valA, num); array b = constant(valB, num); array c = constant(valC, num); eval(a); eval(b); eval(c); // Creating a kernel { array d = a + b; array e = a + c; array f1 = d * e - e; float *hF1 = f1.host<float>(); for (int i = 0; i < num; i++) { ASSERT_EQ(hF1[i], valF1); } freeHost(hF1); } // Making sure a different kernel is generated { array d = a + b; array e = a + c; array f2 = d * e - d; float *hF2 = f2.host<float>(); for (int i = 0; i < num; i++) { ASSERT_EQ(hF2[i], valF2); } freeHost(hF2); } }