Вот мои результаты:
1608.8 ns
1554.9 ns
1582.5 ns
(без MathNET, хотя здесь это не важно). Os Ubuntu 10.10 (32bit), Mono 2.10.7. На данный момент вы можете рассмотреть возможность создания отчета об ошибке для версии Windows Mono. Но:
Я думаю, что это неправильный способ для сравнения операций SIMD из-за накладных расходов механизмов теста.
Например, посмотрите на этот примитивный тест, основанный на вашем Vector4
классе.
const int count = 100000;
var simdVector = new Vector4f(1, 2, 3, 4);
var simdResult = simdVector;
var sw = Stopwatch.StartNew();
for(var i = 0; i < count; i++)
{
simdResult += simdVector;
}
sw.Stop();
Console.WriteLine("SIMD result: {0} {1}", sw.Elapsed, simdResult);
sw = Stopwatch.StartNew();
var usualVector = new Vector4(1, 2, 3, 4);
var usualResult = usualVector;
for(var i = 0; i < count; i++)
{
usualResult += usualVector;
}
sw.Stop();
Console.WriteLine("Usual result: {0} {1}", sw.Elapsed, usualResult);
На моей машине результаты:
SIMD result: 00:00:00.0005802 <100001, 200002, 300003, 400004>
Usual result: 00:00:00.0029598 <100001, 200002, 300003, 400004>
Так что что-то определенно отличается от ваших тестов. Таким образом, вы можете подумать, что SIMD-операции являются тем фактором быстрее, но сравнительный анализ не так прост. Есть много причин, по которым верхняя петля быстрее в этой конфигурации. Эти причины можно обсудить в другой раз.
Тем не менее, уверен, что SIMD на быстрее, чем пара добавлений подряд. Вам следует проверить, действительно ли они испускаются.
В Linux можно проверить сгенерированную сборку (в смысле сборки целевого процессора, а не моно сборки;)) с помощью mono -v -v
. Тем не менее, я не уверен, работает ли он на обычной системе Windows, так как он, вероятно, использует disas от GCC (возможно, вам больше повезет с использованием cygwin). Читая такую сборку, вы можете проверить, действительно ли выполняются операции SIMD.
Например, изучая сборку, сгенерированную для вставленной выше программы, можно обнаружить, что она использует инструкцию addps
в цикле SIMD, что мы и ищем здесь.
О, и для полноты здесь вывод с отключенной SIMD:
$ mono --optimize=-simd SimdTest.exe
SIMD result: 00:00:00.0027111 <100001, 200002, 300003, 400004>
Usual result: 00:00:00.0026127 <100001, 200002, 300003, 400004>
, который не так важен, как сгенерированная сборка, не содержит операций SIMD.
Надеюсь, это было полезно.