diff --git a/tests/testKernel.c b/tests/testKernel.c index 13f4e36534eb11a4c8f7ba9c19a48de6599e31f5..0f627675cbfbcbc6fe926ee6617f83d3aeacb5de 100644 --- a/tests/testKernel.c +++ b/tests/testKernel.c @@ -39,7 +39,7 @@ int main() { const float numPoints_inv = 1. / numPoints; for (int i = 0; i < numPoints; ++i) { - u[i] = i * 2.5f * numPoints_inv / h; + u[i] = i * 2.25f * numPoints_inv / h; } for (int i = 0; i < numPoints; ++i) { @@ -55,18 +55,22 @@ int main() { #ifdef WITH_VECTORIZATION + printf("\nVector Output for kernel_deval_1_vec\n"); + printf("-------------\n"); + + /* Test vectorised kernel that uses one vector. */ for (int i = 0; i < numPoints; i += VEC_SIZE) { vector vx, vx_h; vector W_vec, dW_vec; for (int j = 0; j < VEC_SIZE; j++) { - vx.f[j] = (i + j) * 2.5f / numPoints; + vx.f[j] = (i + j) * 2.25f / numPoints; } vx_h.v = vx.v / vec_set1(h); - kernel_deval_vec(&vx_h, &W_vec, &dW_vec); + kernel_deval_1_vec(&vx_h, &W_vec, &dW_vec); for (int j = 0; j < VEC_SIZE; j++) { printf("%2d: h= %f H= %f x=%f W(x,h)=%f dW(x,h)=%f\n", i + j, h, @@ -85,6 +89,63 @@ int main() { } } + printf("\nVector Output for kernel_deval_2_vec\n"); + printf("-------------\n"); + + /* Test vectorised kernel that uses two vectors. */ + for (int i = 0; i < numPoints; i += VEC_SIZE) { + + vector vx, vx_h; + vector W_vec, dW_vec; + + vector vx_2, vx_h_2; + vector W_vec_2, dW_vec_2; + + for (int j = 0; j < VEC_SIZE; j++) { + vx.f[j] = (i + j) * 2.25f / numPoints; + vx_2.f[j] = (i + j) * 2.25f / numPoints; + } + + vx_h.v = vx.v / vec_set1(h); + vx_h_2.v = vx_2.v / vec_set1(h); + + kernel_deval_2_vec(&vx_h, &W_vec, &dW_vec, &vx_h_2, &W_vec_2, &dW_vec_2); + + /* Check first vector results. */ + for (int j = 0; j < VEC_SIZE; j++) { + printf("%2d: h= %f H= %f x=%f W(x,h)=%f dW(x,h)=%f\n", i + j, h, + h * kernel_gamma, vx.f[j], W_vec.f[j], dW_vec.f[j]); + + if (fabsf(W_vec.f[j] - W[i + j]) > 2e-7) { + printf("Invalid value ! scalar= %e, vector= %e\n", W[i + j], + W_vec.f[j]); + return 1; + } + if (fabsf(dW_vec.f[j] - dW[i + j]) > 2e-7) { + printf("Invalid value ! scalar= %e, vector= %e\n", dW[i + j], + dW_vec.f[j]); + return 1; + } + } + + /* Check second vector results. */ + for (int j = 0; j < VEC_SIZE; j++) { + printf("%2d: h= %f H= %f x=%f W(x,h)=%f dW(x,h)=%f\n", i + j, h, + h * kernel_gamma, vx_2.f[j], W_vec_2.f[j], dW_vec_2.f[j]); + + if (fabsf(W_vec_2.f[j] - W[i + j]) > 2e-7) { + printf("Invalid value ! scalar= %e, vector= %e\n", W[i + j], + W_vec_2.f[j]); + return 1; + } + if (fabsf(dW_vec_2.f[j] - dW[i + j]) > 2e-7) { + printf("Invalid value ! scalar= %e, vector= %e\n", dW[i + j], + dW_vec_2.f[j]); + return 1; + } + } + } + printf("\nAll values are consistent\n"); #endif