All streams
Search
Write a publication
Pull to refresh
126
0
Send message
Или gcc -fopenmp -std=c99 -O2 pi.c -fdump-tree-optimized. Но там мало чего интересного. Содержимое блоков OpenMP вынесено в отдельные функции main._omp_fn.0 и main._omp_fn.1, а в main вызывается GOMP_parallel_start, которой передаётся указатель на функцию. Редукция чуть поинтересней.

Версия на чистом си
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <sys/times.h>
#include <omp.h>

int main(int argc, char **argv)
{
    const unsigned long numSteps = 500000000; /* default # of rectangles */
    double PI25DT = 3.141592653589793238462643;
    double step, pi = 0, sum=0.0, x;

    #pragma omp parallel
    {
    #pragma omp master
        {
            int cntThreads = omp_get_num_threads();
            printf("OpenMP. number of threads = %d\n", cntThreads);
        }
    }

    clock_t clockStart, clockStop;
    struct tms tmsStart, tmsStop;
    step = 1./(double)numSteps;
    clockStart = times(&tmsStart);
    #pragma omp parallel for private (x), reduction (+:sum)
        for (int i = 0; i < numSteps; i++)
        {
            x = (i + .5) * step;
            sum = sum + 4.0 / (1. + x * x);
        }
    
    pi = sum * step;
    clockStop = times(&tmsStop);
    printf("The value of PI is %lf Error is %lf\n", pi, fabs(pi - PI25DT));
    double secs = (clockStop - clockStart)/(double)sysconf(_SC_CLK_TCK);
    printf("The time to calculate PI was %lf  seconds\n", secs);
    
    return 0;
}

Результат -fdump-tree-optimized
;; Function main._omp_fn.0 (main._omp_fn.0, funcdef_no=23, decl_uid=3556, cgraph_uid=23)

main._omp_fn.0 (void * .omp_data_i)
{
  int cntThreads;
  int D.3622;

<bb 2>:
  D.3622_1 = __builtin_omp_get_thread_num ();
  if (D.3622_1 == 0)
    goto <bb 4>;
  else
    goto <bb 3>;

<bb 3>:
  return;

<bb 4>:
  cntThreads_2 = __builtin_omp_get_num_threads ();
  __printf_chk (1, "OpenMP. number of threads = %d\n", cntThreads_2); [tail call]
  goto <bb 3>;

}



;; Function main._omp_fn.1 (main._omp_fn.1, funcdef_no=24, decl_uid=3560, cgraph_uid=27)

Removing basic block 10
Removing basic block 11
main._omp_fn.1 (struct .omp_data_s.1 * .omp_data_i)
{
  double pretmp.15;
  long unsigned int D.3620;
  long unsigned int D.3618;
  double D.3617;
  double D.3616;
  long unsigned int * {ref-all} D.3613;
  double D.3611;
  double D.3610;
  double D.3609;
  double x;
  double D.3606;
  double D.3605;
  int D.3604;
  int D.3602;
  int tt.5;
  int q.4;
  int D.3599;
  int D.3598;
  int i;
  double sum;

<bb 2>:
  D.3598_9 = __builtin_omp_get_num_threads ();
  D.3599_10 = __builtin_omp_get_thread_num ();
  q.4_11 = 500000000 / D.3598_9;
  tt.5_12 = 500000000 % D.3598_9;
  if (D.3599_10 < tt.5_12)
    goto <bb 9>;
  else
    goto <bb 3>;

<bb 3>:
  # q.4_4 = PHI <q.4_14(9), q.4_11(2)>
  # tt.5_5 = PHI <0(9), tt.5_12(2)>
  D.3602_15 = q.4_4 * D.3599_10;
  i_16 = D.3602_15 + tt.5_5;
  D.3604_17 = i_16 + q.4_4;
  if (i_16 >= D.3604_17)
    goto <bb 6>;
  else
    goto <bb 4>;

<bb 4>:
  pretmp.15_56 = .omp_data_i_21(D)->step;

<bb 5>:
  # sum_1 = PHI <0.0(4), sum_27(5)>
  # i_3 = PHI <i_16(4), i_28(5)>
  D.3605_19 = (double) i_3;
  D.3606_20 = D.3605_19 + 5.0e-1;
  x_23 = D.3606_20 * pretmp.15_56;
  D.3609_24 = x_23 * x_23;
  D.3610_25 = D.3609_24 + 1.0e+0;
  D.3611_26 = 4.0e+0 / D.3610_25;
  sum_27 = D.3611_26 + sum_1;
  i_28 = i_3 + 1;
  if (i_28 != D.3604_17)
    goto <bb 5>;
  else
    goto <bb 6>;

<bb 6>:
  # sum_2 = PHI <0.0(3), sum_27(5)>
  D.3613_30 = &.omp_data_i_21(D)->sum;
  D.3620_31 = MEM[(long unsigned int * {ref-all}).omp_data_i_21(D) + 8B];

<bb 7>:
  # D.3620_6 = PHI <D.3620_31(6), D.3620_36(7)>
  D.3616_33 = VIEW_CONVERT_EXPR<double>(D.3620_6);
  D.3617_34 = D.3616_33 + sum_2;
  D.3618_35 = VIEW_CONVERT_EXPR<long unsigned int>(D.3617_34);
  D.3620_36 = __sync_val_compare_and_swap_8 (D.3613_30, D.3620_6, D.3618_35);
  if (D.3620_6 != D.3620_36)
    goto <bb 7>;
  else
    goto <bb 8>;

<bb 8>:
  return;

<bb 9>:
  q.4_14 = q.4_11 + 1;
  goto <bb 3>;

}



;; Function main (main, funcdef_no=22, decl_uid=3527, cgraph_uid=22) (executed once)

main (int argc, char * * argv)
{
  double secs;
  struct tms tmsStop;
  struct tms tmsStart;
  clock_t clockStop;
  clock_t clockStart;
  double sum;
  double pi;
  double step;
  double D.3553;
  long int D.3552;
  double D.3551;
  long int D.3550;
  double D.3549;
  double D.3548;
  struct .omp_data_s.1 .omp_data_o.2;

<bb 2>:
  __builtin_GOMP_parallel_start (main._omp_fn.0, 0B, 0);
  main._omp_fn.0 (0B);
  __builtin_GOMP_parallel_end ();
  clockStart_6 = times (&tmsStart);
  .omp_data_o.2.sum = 0.0;
  .omp_data_o.2.step = 2.00000000000000012456318291555971283779413738557195756584e-9;
  __builtin_GOMP_parallel_start (main._omp_fn.1, &.omp_data_o.2, 0);
  main._omp_fn.1 (&.omp_data_o.2);
  __builtin_GOMP_parallel_end ();
  sum_7 = .omp_data_o.2.sum;
  step_8 = .omp_data_o.2.step;
  pi_9 = sum_7 * step_8;
  clockStop_10 = times (&tmsStop);
  D.3548_11 = pi_9 - 3.141592653589793115997963468544185161590576171875e+0;
  D.3549_12 = ABS_EXPR <D.3548_11>;
  __printf_chk (1, "The value of PI is %lf Error is %lf\n", pi_9, D.3549_12);
  D.3550_13 = clockStop_10 - clockStart_6;
  D.3551_14 = (double) D.3550_13;
  D.3552_15 = sysconf (2);
  D.3553_16 = (double) D.3552_15;
  secs_17 = D.3551_14 / D.3553_16;
  __printf_chk (1, "The time to calculate PI was %lf  seconds\n", secs_17);
  tmsStart ={v} {CLOBBER};
  tmsStop ={v} {CLOBBER};
  return 0;

}
12 изображений, серьезно? Вы хотя бы в спрайт их убрали. Не говоря уж о том, что все эти уголки и градиенты спокойно делаются в CSS. Кстати, с картинками на дисплеях с масштабированием или с высокой плотностью пикселей (это ведь для IOS-related сайтов?) всё будет совсем плохо.
автор выступает с инициативой найти того, кто слил информацию ФБР

Мне одному стало смешно от этой фразы? Автор сей фразы вообще в курсе, где находится Apple и что такое ФБР?
Ещё: 70% MediaWiki занимают переводы на 373 языка, хранящиеся в виде исходников PHP без комментариев. Оценка в 4% комментариев категорически неточна: сам код MediaWiki хорошо документирован, что позволяет генерировать API-документацию автоматически (обычное явление для всех модульных движков, не только для MediaWiki).
Осторожнее с подсчётом строк. Например, исходники OpenOffice включают в себя (внезапно!) Mozilla SeaMonkey (возможно теперь он уже не SeaMonkey, но с него всё начиналось). Пару месяцев назад в LibreOffice включили по умолчанию флаг --disable-mozilla, но эта груда кода, сравнимая с Mozilla Firefox, пока, насколько мне известно, лежит в репозитариях LO.

Qt включает как минимум энкодеры/декодеры форматов изображений и zlib (на случай винды). Ещё размер Qt сложно оценить, из-за его раздробленности: я правильно понимаю, что не учтены QtWebKit и Phonon? Ещё одна гора заимствованного кода.

Blender (основной репозитарий) включает физ. движок Bullet, FFMPEG, OpenJPEG, Glew, lzma, lzo и ещё пару мелких библиотек.

Ну и так далее.

Ещё в некоторых репозитариях встречаются огромные сгенерированные исходники от лексеров, парсеров, генераторов привязок и преобразователей бинарных файлов.
Не забывайте, что монитор можно повернуть. Два повёрнутых 29-дюймовых монитора определённо лучше, чем просто два монитора. См. http://habrahabr.ru/post/116520/.
Эта была одна из последних версии, у которой оракловская ява ещё была в партнёрском репозитарии (уже даже не в основном). В последующих версиях её выперли, причём довольно грубо. После падения Sun Oracle отозвала разрешение на включение Java в дистрибутивы, после этого выпустила обновление безопасности. Canonical в ответ выпустила обновление, выключающее яву в браузерах. Позже, Canonical заменила пакеты Oracle Java в partner-репозитарии пустышками, тем самым вызвав массовое удаление Oracle JRE со всех машин. Сейчас Ubuntu, как и все другие дистрибутивы (кроме разве что какого-нибудь Oracle Linux), перешли на OpenJDK и IcedTea, которые основаны на другой кодовой базе под GPL и не наследуют баги Web Start и всякого enterprise-решета.
Ubuntu 12.10 уже давно использует Firefox 15. По плану выпусков рассчитали, что к приближению релиза выйдет 15-я версия Firefox и дали её всем на тестирование в официальном репозитарии. По-моему так и надо. А для 12.04 и более ранних выйдет по мере фиксов безопасности. Куда обычным пользователям торопиться? Пусть бета-тестеры словят все радости новых версий программ, которые в сочетаниях ведут себя иногда прямо-таки магическим образом.
Re: Постоянно переходят на новые языки, платформы, базы данных, устройства и т.д.
… и натыкаетесь на дубликат, поскольку все базовые поломки уже всем известны. В частности, на данный момент сломаны пакеты драйверов ATI и NVidia и пока намеренно не чинятся. Ручная установка последней версии драйвера NVidia приводит к неизбежному падению xorg при запуске unity, gnome-shell, firefox и прочих glx-приложений. Opera недорисовывает интерфейс, Chrome периодически исполняет Малевича. Разработчик NVidia пишет, что мы сами виноваты, что пользуемся бета-версией Xorg с новым ABI, который они не поддерживают (но люди ждут), ответа ATI я не видел. Таким образом, пересборка пакетов не выгодна, поскольку просто убьёт Xorg окончательно.

Касательно альфа-версий Ubuntu, нужно обладать навыками по восстановлению сломанной системы и мягче воспринимать нестабильность (ага, мягче. Лично у меня так накипело, что пишу оффтопик-комментарий). Ежедневные сборки на работоспособность вообще мало кто проверяет, может свалиться на середине установки. Но зато потом получаешь самое свежее ядро, ещё не вышедший xserver, unity+related, решатель всех проблем Apport и много чего ещё интересного. И оно того стоит.
Я не ахти какой дизайнер, но прекрасно вижу все артефакты. Осветляющий контур от блоков 8x8 в принципе можно принять за декоративный элемент, но зашумлённый серый текст всё равно выдаёт потери.
Так будет выглядеть терраформирование марса. После начала заселения идея общего предка станет несостоятельной, поскольку жителями Марса станут лишь доля процента от жителей земли. В дальнейшем, при колонизации других планет смысл общего предка пропадёт окончательно.
Самое интересное, что этот закон экстраполируется и в будущее.

image
в глазах университета — продали ценные научные сведенья зарубежной компании, лишив университет всех прав на вашу разработку, т.е. стырили интеллектуальную собственность

Но ведь это не правда? Насколько мне известно, одно из принципиальных отличий GSoC от Microsoft Research в том, что Google не забирает все наработки студентов себе. В то же время участники MSR работают исключительно за деньги, поскольку весь весь код в конечном счёте будет принадлежать Microsoft, а все более-менее нетривиальные идеи будут описаны в соответствующих патентах, дабы исключить вероятность альтернативной реализации бывшими сотрудниками. Не говоря уж об NDA: как видно по комментарию выше, участники MSR даже рассказать не могут о том, над чем они работают, тогда как на GSoC самостоятельные научные публикации по теме работы только приветствуются.
Только когда используешь всё это, другим юзерам-непрограммистам вся эта викиразметка снится в страшном сне и кажется, что всё можно было бы сделать намного проще. Но вот, что на самом деле скрывается под одной строчкой псевдокода if exists rq/$1: include rq/($1, nocat):

if 1 in args and args[1].strip():
    if exist('Шаблон:Rq/' + args[1]):
        include_template('Шаблон:Rq/' + args[1], args['nocat'] if args.get('nocat', '').strip() else ''):
    else:
        print("<span style=\"color:#F00\">'''Неверный параметр шаблона {{tl|rq}} — ''[[Шаблон:rq/%1|%1]]''. Проверьте исходный текст и обратитесь к [[Шаблон:rq/doc|документации]].'''</span>" % args[1])

        if not args.get('nocat', '').strip() and parser.namespace == 0:
            print("[[Категория:Википедия:Статьи с некорректным использованием шаблона rq]]")

При всём желании на lua не получится написать изящнее, чем на python. Хотя как вспомогательный язык, lua будет хорошим дополнением.
Богатство языка или бранная лексика, прямо-таки биномиальный выбор. Написали бы прямо:
законы, которые одобрены голосованием в бундестаге, будут приняты
Проще договориться с Chikey :)
Ну ладно, думаю, почту-то прочитать надо, отвечу я на ваши вопросы.

Вот тут-то вы и попались. Первая реакция на очевидный лохотрон — закрыть сайт, а не кликать по кнопочкам. Пока вы гуляете по таким сайтам, вы вполне можете порекомендовать эти сайты в социальных сетях или отправить парочку спам-писем с уязвимых сайтов (а уязвимости есть везде, см. habrahabr.ru). Кликджекинг никто не отменял, не понимаю, почему о нём все забывают.

Information

Rating
Does not participate
Registered
Activity