При этом каталог PATH_TO_NEW_PROFILE_DIR создаётся, если не существовал до этого.
Для программиста путь несложный, но для конечного пользователя неприемлемый.
Правильный пример придумать сложно. Навскидку придумывается ещё 3 варианта (6 если с OpenMP).
Обзову исходный вариант вариантом 0.
1. Хранить непрерывный кусок памяти. Тогда внутренний цикл:
double res = 0;
for (int k = 0; k < size; k++)
{
res += m1[i*size+k] * m2[k*size+j];
}
result[i*size+j] = res;
2. Хранить непрерывный кусок памяти. Перед перемножением делать inplace (или outplace)
транспонирование второй матрицы, если inplace, то повторно транспонируем перед выходом.
Тогда внутренний цикл:
double res = 0;
for (int k = 0; k < size; k++)
{
res += m1[i*size+k] * m2[j*size+k];
}
result[i*size+j] = res;
3. Помесь 0 и 2. Хранить также как в 0, перестранспонировать перед перемножением.
Как видно вариант 1 оказывается очень плохим. Он проигрывает на больших данных (>=512) варианту 0 за счёт
нелокализованности данных второй матрицы.
Вариант 2 хочет это исправить, и действительно, он лучше на больших данных (>=64), чем оба варианта.
2+OMP ещё быстрее. Так на 1024 выигрыш почти в 6 раз по сравнению с 0.
Вариант 3 я не тестировал, но ожидаю порядок как в 2.
Думаю, что не проблема научить секретаршу пользоваться LaTeX. Грамотный админ должен установить софт + тренинг на один рабочий день.
Другое, что для мощь LaTeX не нужна для тех документов, которые делает секретарша. Word обычно подходит (odt/sxw, один чёрт, подойдут), тем более что с ним проще.
Реальная проблема с LaTeX следующая (с ней сталкивался):
- я пишу документ для человека, но не могу его заставить поставить TeX (большой начальник :) )
- посылаю ему PDF
- он хочет в документе внести правки, а не судьба
- с Word'ом этого нет. Здесь просмотрщик == редактор
Очень грамотное решение использовать распределённую VCS. Сам использую mercurial.
Если хоть один репозиторий выживет, то всё ok. С subversion нужно постоянно backup'ить.
Как вариант ещё, хранить репозиторий в сети. Например на assembla.com можно хранить меркуриаловские репозитории.
chrome.exe -user-data-dir=«PATH_TO_NEW_PROFILE_DIR»
При этом каталог PATH_TO_NEW_PROFILE_DIR создаётся, если не существовал до этого.
Для программиста путь несложный, но для конечного пользователя неприемлемый.
Обзову исходный вариант вариантом 0.
1. Хранить непрерывный кусок памяти. Тогда внутренний цикл:
double res = 0;
for (int k = 0; k < size; k++)
{
res += m1[i*size+k] * m2[k*size+j];
}
result[i*size+j] = res;
2. Хранить непрерывный кусок памяти. Перед перемножением делать inplace (или outplace)
транспонирование второй матрицы, если inplace, то повторно транспонируем перед выходом.
Тогда внутренний цикл:
double res = 0;
for (int k = 0; k < size; k++)
{
res += m1[i*size+k] * m2[j*size+k];
}
result[i*size+j] = res;
3. Помесь 0 и 2. Хранить также как в 0, перестранспонировать перед перемножением.
Результаты моего тестирования.
size 0 1 2 2+OMP
2 6.78E-07 1.52E-06 1.66E-06 0.00192453
3 9.10E-07 1.17E-06 1.62E-06 0.000102599
4 9.88E-07 1.31E-06 1.61E-06 1.94E-05
6 2.39E-06 2.46E-06 2.98E-06 1.93E-05
8 3.32E-06 3.72E-06 4.72E-06 0.00010015
12 9.30E-06 8.63E-06 8.73E-06 0.000108805
16 1.90E-05 1.72E-05 1.59E-05 0.000129605
24 4.21E-05 5.10E-05 4.39E-05 4.84E-05
32 0.000105829 0.000110913 0.000111641 8.29E-05
48 0.000389326 0.000372065 0.000350789 0.000482888
64 0.00118052 0.0010987 0.000770939 0.000408367
96 0.0054682 0.00384442 0.00249066 0.00257223
128 0.0227045 0.00868955 0.00487929 0.0035134
192 0.0923321 0.0412351 0.0160446 0.00996233
256 0.214051 0.0981237 0.039727 0.0274157
384 0.835667 0.593905 0.171508 0.103088
512 1.95026 9.50343 0.425949 0.292215
768 6.60759 32.5627 1.43155 1.04692
1024 15.6639 76.2935 3.35798 2.59858
Извиняюсь за форматирование :(
Как видно вариант 1 оказывается очень плохим. Он проигрывает на больших данных (>=512) варианту 0 за счёт
нелокализованности данных второй матрицы.
Вариант 2 хочет это исправить, и действительно, он лучше на больших данных (>=64), чем оба варианта.
2+OMP ещё быстрее. Так на 1024 выигрыш почти в 6 раз по сравнению с 0.
Вариант 3 я не тестировал, но ожидаю порядок как в 2.
Как уже заметили выше, кусок на C++ написан плохо.
P.S. Это не умаляет ценности написанного :)
Очень хороша связка Emacs + AUCTex.
Другое, что для мощь LaTeX не нужна для тех документов, которые делает секретарша. Word обычно подходит (odt/sxw, один чёрт, подойдут), тем более что с ним проще.
Реальная проблема с LaTeX следующая (с ней сталкивался):
- я пишу документ для человека, но не могу его заставить поставить TeX (большой начальник :) )
- посылаю ему PDF
- он хочет в документе внести правки, а не судьба
- с Word'ом этого нет. Здесь просмотрщик == редактор
Если хоть один репозиторий выживет, то всё ok. С subversion нужно постоянно backup'ить.
Как вариант ещё, хранить репозиторий в сети. Например на assembla.com можно хранить меркуриаловские репозитории.