63 lines
1.6 KiB
Plaintext
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);
|
|
}
|