Files
ispc/tests_ispcpp/sqrt.ispc

63 lines
1.6 KiB
Plaintext

static const float kThreshold = 0.00001f;
export void sqrt_ispc(uniform int N,
uniform floating initialGuess,
uniform floating values[],
uniform floating output[])
{
foreach (i = 0 ... N) {
floating x = values[i];
floating guess = initialGuess;
floating pred = abs(guess * guess * x - 1.f);
while (pred > kThreshold) {
guess = (3.f * guess - x * guess * guess * guess) * 0.5f;
pred = abs(guess * guess * x - 1.f);
}
output[i] = x * guess;
}
}
task void sqrt_ispc_task(uniform int N,
uniform int span,
uniform floating initialGuess,
uniform floating values[],
uniform floating output[])
{
uniform int indexStart = taskIndex * span;
uniform int indexEnd = min(N, indexStart + span);
foreach (i = indexStart ... indexEnd) {
floating x = values[i];
floating guess = initialGuess;
floating pred = abs(guess * guess * x - 1.f);
while (pred > kThreshold) {
guess = (3.f * guess - x * guess * guess * guess) * 0.5f;
pred = abs(guess * guess * x - 1.f);
}
output[i] = x * guess;
}
}
export void sqrt_ispc_withtasks(uniform int N,
uniform floating initialGuess,
uniform floating values[],
uniform floating output[])
{
uniform int span = N / 64; // 64 tasks
launch[N/span] sqrt_ispc_task(N, span, initialGuess, values, output);
}