public static unsafe void TestMultiplyCorrectness()
{
const int iterationCount = 100000;
Random random = new Random(5);
for (int iterationIndex = 0; iterationIndex < iterationCount; ++iterationIndex)
{
Matrix simdA, simdB;
Matrix4x4 systemA, systemB;
bMatrix scalarA, scalarB;
var simdPointerA = (float*)&simdA;
var systemPointerA = (float*)&systemA;
var scalarPointerA = (float*)&scalarA;
var simdPointerB = (float*)&simdB;
var scalarPointerB = (float*)&scalarB;
var systemPointerB = (float*)&systemB;
for (int i = 0; i < 16; ++i)
{
scalarPointerA[i] = systemPointerA[i] = simdPointerA[i] = (float)(random.NextDouble() * 4 - 2);
scalarPointerB[i] = systemPointerB[i] = simdPointerB[i] = (float)(random.NextDouble() * 4 - 2);
}
Matrix simdResult;
Matrix.Multiply(ref simdA, ref simdB, out simdResult);
var systemResult = Matrix4x4.Multiply(systemA, systemB);
bMatrix scalarResult;
bMatrix.Multiply(ref scalarA, ref scalarB, out scalarResult);
var simdPointerResult = (float*)&simdResult;
var scalarPointerResult = (float*)&scalarResult;
var systemPointerResult = (float*)&systemResult;
for (int i = 0; i < 16; ++i)
{
const float threshold = 1e-5f;
var simdScalarError = Math.Abs(simdPointerResult[i] - scalarPointerResult[i]);
var simdSystemError = Math.Abs(simdPointerResult[i] - systemPointerResult[i]);
if (simdScalarError > threshold ||
simdSystemError > threshold)
{
Console.WriteLine($"Excess error for {i}");
}
}
}
for (int iterationIndex = 0; iterationIndex < iterationCount; ++iterationIndex)
{
Matrix simdA, simdB;
Matrix4x4 systemA, systemB;
bMatrix scalarA, scalarB;
var simdPointerA = (float*)&simdA;
var systemPointerA = (float*)&systemA;
var scalarPointerA = (float*)&scalarA;
var simdPointerB = (float*)&simdB;
var scalarPointerB = (float*)&scalarB;
var systemPointerB = (float*)&systemB;
for (int i = 0; i < 16; ++i)
{
scalarPointerA[i] = systemPointerA[i] = simdPointerA[i] = (float)(random.NextDouble() * 4 - 2);
scalarPointerB[i] = systemPointerB[i] = simdPointerB[i] = (float)(random.NextDouble() * 4 - 2);
}
Matrix.Multiply(ref simdA, ref simdB, out simdA);
systemA = Matrix4x4.Multiply(systemA, systemB);
bMatrix.Multiply(ref scalarA, ref scalarB, out scalarA);
for (int i = 0; i < 16; ++i)
{
const float threshold = 1e-5f;
var simdScalarError = Math.Abs(simdPointerA[i] - scalarPointerA[i]);
var simdSystemError = Math.Abs(simdPointerA[i] - systemPointerA[i]);
if (simdScalarError > threshold ||
simdSystemError > threshold)
{
Console.WriteLine($"Excess error for {i}");
}
}
}
for (int iterationIndex = 0; iterationIndex < iterationCount; ++iterationIndex)
{
Matrix simdA, simdB;
Matrix4x4 systemA, systemB;
bMatrix scalarA, scalarB;
var simdPointerA = (float*)&simdA;
var systemPointerA = (float*)&systemA;
var scalarPointerA = (float*)&scalarA;
var simdPointerB = (float*)&simdB;
var scalarPointerB = (float*)&scalarB;
var systemPointerB = (float*)&systemB;
for (int i = 0; i < 16; ++i)
{
scalarPointerA[i] = systemPointerA[i] = simdPointerA[i] = (float)(random.NextDouble() * 4 - 2);
scalarPointerB[i] = systemPointerB[i] = simdPointerB[i] = (float)(random.NextDouble() * 4 - 2);
}
//MatrixSIMD.Multiply(ref simdA, ref simdB);
Matrix.Multiply(ref simdA, ref simdB, out simdB);
systemB = Matrix4x4.Multiply(systemA, systemB);
bMatrix.Multiply(ref scalarA, ref scalarB, out scalarB);
for (int i = 0; i < 16; ++i)
{
const float threshold = 1e-5f;
var simdScalarError = Math.Abs(simdPointerB[i] - scalarPointerB[i]);
var simdSystemError = Math.Abs(simdPointerB[i] - systemPointerB[i]);
if (simdScalarError > threshold ||
simdSystemError > threshold)
{
Console.WriteLine($"Excess error for {i}");
}
}
}
for (int iterationIndex = 0; iterationIndex < iterationCount; ++iterationIndex)
{
Matrix simd;
Matrix4x4 system;
bMatrix scalar;
var simdPointer = (float*)&simd;
var systemPointer = (float*)&system;
var scalarPointer = (float*)&scalar;
for (int i = 0; i < 16; ++i)
{
scalarPointer[i] = systemPointer[i] = simdPointer[i] = (float)(random.NextDouble() * 4 - 2);
}
Matrix.Multiply(ref simd, ref simd, out simd);
system = Matrix4x4.Multiply(system, system);
bMatrix.Multiply(ref scalar, ref scalar, out scalar);
for (int i = 0; i < 16; ++i)
{
const float threshold = 1e-5f;
var simdScalarError = Math.Abs(simdPointer[i] - scalarPointer[i]);
var simdSystemError = Math.Abs(simdPointer[i] - systemPointer[i]);
if (simdScalarError > threshold ||
simdSystemError > threshold)
{
Console.WriteLine($"Excess error for {i}");
}
}
}
}