Есть массив длиной 12 454 100 992, в каждой ячейке массива содержится положительное или отрицательное число.
Как максимально быстро можно получить сумму всех чисел, при этом НЕ распараллеливая на потоки и вычисления производятся на процессоре 3700 МГц (видеокарта не предусмотрена)?
Дополню свой вопрос.
Возможно проще написать на ассемблере с побитовыми сдвигами, чем это делать на языке высокого уровня аля 2+2.
Вот тут загвостка, где будет быстрее происходит вычисления ?
P.S. Интересует затраченное время на действие передача в регистр значение + команды. Т.е. будет ли отличатся время исполнения данной команды написанной на С или ассемблер
Задача вообще не понятна. Частота процессора указана, а размерность регистров и массива -нет, где храниться массив то-же. В общем случае будет все равно упираться в IO, если без параллелизма - через реальный режим работы процессора и пачками через AVX и хорошо постараться с кэшем.
В данном случае будет отличаться, если исполнитель знаком с процессором, для которого пишется программа. При программировании на Си результат будет быстрее, при программирование на asm - задача будет выполняться быстрее, особенно при задействовании SIMD инструкций, которые могут по 8 слов за такт обрабатывать.
ЗЫ: А побитовые сдвиги причем вообще? Они только на 2 могут умножать и делить. А для сложения отрицательного числа его еще в обратный код переводить - с чем встроенный в процессор декодер справиться задолго до выхода операции из конвейера.
При включении агрессивной оптимизации -O3 особой разницы быть не должно, главное не пытаться быть умнее компилятора:
1) если помещается в память, то напишите тупой цикл-сложение по вектору с числами
2) если не помещается, то читайте с диска блоками не меньше мегабайта, чтобы компенсировать latency
3) помните о переполнении типов
Твой вопрос сводится к вырожденному вопросу: "Можно ли угадать данные на диске, не зная природы этих данных, а зная только длину".
Ответ: нельзя.
Дополнил ответ
Я правда крайне сомневаюсь, что ассемблер сможет раскрутить твой хард быстрее чем Си. Или ты считаешь, что аппаратная арифметика будет медленней харда?
Вам так или иначе придется их считать с диска хотя бы по одному разу, а раз так, то вы можете их просто просуммировать, читать лучше блоками, чтобы минимизировать io.
Владимир Олохтонов, Дополнил вопрос. Будем считать весь массив лежит в оперативной памяти. Интересует затраченное время на действие передача в регистр значение + команды. Т.е. будет ли отличатся код написанный на С или ассемблер