r1 - 31 Jan 2006 - 23:49:59 - Ordi TaderYou are here: TWiki >  OPENTS Web > ЧаВО > Asynh
Как добиться «асинхронности» в случае, если, например, в задаче требуется неопределенное количество раз вызвать t-функцию, а все результаты, к примеру, просуммировать.

Можно, конечно, завести массив t-величин

ts::TVar<int>* results = new ts::TVar<int>[N];

  tval int number=0;

  for (int i=0; i<N; i++){

    results[i]=test(i); // test &#8211; некоторая t-функция

  }

 

  for (int i1=0; i1<N; i1++){

    number+=results[i1];

  }
а потом их просуммировать

Однако, существует еще один вариант:


#include <iostream.h>

/* определим т-функцию, которая складывает 2 неготовых значения и возвращает 

*  неготовое

*/

tfun int plus (tval int a, tval int b, tout int c){

  c=(int)a+(int)b;

  return 0;

}

 

tfun int test(int a){ // имеется т-функция, которая достаточно увесистая

  //std::cout << ts::myRank<<std::endl;

  int k;

  a++;

  for (int i=0; i<10000; i++){ //и что-то долго вычисляет

    for (int j=0; j<10000;j++){

      k=100*j*i;

    }

  }

 

  return a;

}

 

tfun int main(int argc, char * argv[]){

  int N=atoi(argv[1]); //если N достаточно большое, или вообще заранее неизвестное,

                                   //и мы не можем создать массив t-величин, чтобы его потом

                                   //н-р, просуммировать.

  tval int number=0;

  for (int i=0; i<N; i++){

    plus(test(i), number, number);

  }

  std::cout <<number;

  return 0;

}

Вариант с массивом t-величин работает намного быстрее. например, этот тестовый пример при N=1000 на 2 процессорах работает ~98 секунд, а при использовании массива ~84.

//спасибо за советы А.А. Московскому

-- Ordi Tader - 31 Jan 2006

Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r1 | More topic actions
 
Powered by TWiki

This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback