2013-02-19 2 views
0

Я использую MPI при очень простом вычислении PI с использованием численного интегрирования, используя некоторые математические правила, в конце концов, я преобразую вычисление в суммирование, где он имеет этот формат:Используя MPI для простого расчета, разные количества процессов получают разные результаты?

PI = Σ (f (i)) , где i начинается с 1 до 100000, а f (i) - это функция, возвращающая некоторое значение двойного типа на основе i.

Совершенно очевидно, что при программировании я могу преобразовать сумму в цикл for, повторяя 100000 раз. И с MPI, использующим p-процессоры, я разделяю цикл for на p-сегменты, каждый процессор получает 100000/p циклов (предположим, 100000% p = 0). И позже, используя MPI_Reduce, MPI_SUM, чтобы собрать эти суб-результаты и суммировать их, чтобы получить окончательные результаты.

Однако, когда я использую разные количества процессов, конечные результаты будут немного отличаться, мой конечный результат PI имеет 12-битную точность, и результаты начинают отличаться после 7-го бита.

Я не могу получить ответ, почему результат будет другим, поскольку, на мой взгляд, он просто выполняет точно такие же задачи, как и распределение задач.

Любая помощь будет оценена очень!

+0

Я думаю, что ваш вопрос обрезался – pyCthon

+0

Извините, я только что отредактировал мой вопрос. – Bpache

+0

Можете ли вы показать свой код? – tune2fs

ответ

2

Численный результат операций с плавающей запятой часто зависит от порядка их выполнения. Чтобы понять это, вам сначала нужно понять, как floating point numbers представлены компьютером. Одним из примеров является добавление чисел разного размера: из-за разных показателей один будет усечен (например, округлен). Вы можете увидеть это в этом примере:

double small, result1, result2; 
    small = 1./3000.; 
    result1 = 0.; 
    for (int i = 0; i < 10000; i++) 
      result1 += small; 

    result2 = 0.; 
    for (int i = 0; i < 100; i++) { 
      double tmp = 0.; 
      for (int j = 0; j < 100; j++) 
        tmp += small; 
      result2 += tmp; 
    } 
    printf("result1= %.17g, result2= %.17g\n", result1, result2); 

Вначале добавление номеров во временный результат, происходит меньшее усечение. Очень вероятно, что что-то подобное происходит в вашем коде.

+0

спасибо. очень ясно – Bpache

Смежные вопросы