#include #include #include #include #include #include "CycleTimer.h" #include "sqrt.h" using namespace ispc; void sqrtSerial(int N, float initialGuess, float values[], float output[]) { static const float kThreshold = 0.00001f; for (int i=0; i kThreshold) { guess = (3.f * guess - x * guess * guess * guess) * 0.5f; error = fabs(guess * guess * x - 1.f); } output[i] = x * guess; } } void sqrtSerial(int N, double initialGuess, double values[], double output[]) { static const double kThreshold = 0.00001f; for (int i=0; i kThreshold) { guess = (3. * guess - x * guess * guess * guess) * 0.5; error = std::abs(guess * guess * x - 1.); } output[i] = x * guess; } } static void verifyResult(int N, float* result, float* gold) { for (int i=0; i 1e-4) { printf("Error: [%d] Got %f expected %f\n", i, result[i], gold[i]); } } } static void verifyResult(int N, double* result, double* gold) { for (int i=0; i 1e-4) { printf("Error: [%d] Got %f expected %f\n", i, result[i], gold[i]); } } } int main() { const unsigned int N = 20 * 1000 * 1000; const float initialGuess = 1.0f; const double dinitialGuess = 1.0; float* values = new float[N]; float* output = new float[N]; float* gold = new float[N]; double* dvalues = new double[N]; double* doutput = new double[N]; double* dgold = new double[N]; for (unsigned int i=0; i(rand()) / RAND_MAX; dvalues[i] = .001 + 2.998 * static_cast(rand()) / RAND_MAX; output[i] = 0.f; doutput[i] = 0.; } // generate a gold version to check results for (unsigned int i=0; i