[ -pixi- @ 10.10.2007. 15:50 ] @
Evo ovako: Testiram neki komponent koji vec radi ali ga treba optimirati za vise procesora. Nasao sam i druge varijante ali hocu takodje da isprobam i sa MPI-om. Izabrao sam MPICH implementaciju, jer mi se cinila najpopularnija, ako ko ima iskustva sa drugom pokusao bi i tu. U glavnom je problem u tome sto sve radi kako treba ali ipak ne. Nasao sam sledeci jednostavan primjer da testiram dali stvari rade kako treba:

Code:
#include "stdafx.h"
#undef SEEK_SET
#undef SEEK_END
#undef SEEK_CUR
#include <stdio.h>
#include <mpi.h>

void main (int argc, char *argv[]) {
int err;
err = MPI_Init(&argc, &argv);
printf("Hello world!\n");
err = MPI_Finalize();
}

Na prvi pogled mi je izgledao kao da sve radi kako treba, ali u nastavku teksta u kojem sam nasao primjer bio je naveden i ocekivani output:
Citat:
Hello world!
Hello world!
Hello world!
Hello world!

Kod mene je na veliko razocarenje samo pisalo jednom "Hello World!" znaci problem je u tome sto umjesto na svim procesorima da kod bude posebno izvrsen, kod mene je to slucaj samo na jednom od dva CPU-a (Autor artikla iz kojeg sam uzeo kod imao je znaci 4 CPU-a :), da se ne zbunite). Pomoc zelim znaci u postavljanju kompilera, koji treba da kompajlira kod tako da se izvrsi na oba CPU-a. Za kraj samo da kazem da ovo radim u Visual Studio 2005 ;)

Nadam se da neko ima iskustva i da moze pomoci.
Hvala unaprijed
[ prezakg @ 11.10.2007. 12:23 ] @
Nisam koristio MPI sa VS 2005 tako da mogu da ti dam samo link za podesavanja samo za VS 6.0

http://www-unix.mcs.anl.gov/mpi/mpich1/mpich-nt/msdevhelp.html

I jos jedna stvar, koristi guiMPIRun i u njemu odaberi koliko procesa zelis da pokrenes.

"Hello world " program da proveris da li radi MPI:

Code:
/*
  "Hello World" Type MPI Test Program
 */
 #include <mpi.h>
 #include <stdio.h>
 #include <string.h>
 
 #define BUFSIZE 128
 #define TAG 0
 
 int main(int argc, char *argv[])
 {
   char idstr[32];
   char buff[BUFSIZE];
   int numprocs;
   int myid;
   int i;
   MPI_Status stat; 
 
   MPI_Init(&argc,&argv); /* all MPI programs start with MPI_Init; all 'N' processes exist thereafter */
   MPI_Comm_size(MPI_COMM_WORLD,&numprocs); /* find out how big the SPMD world is */
   MPI_Comm_rank(MPI_COMM_WORLD,&myid); /* and this processes' rank is */
 
   /* At this point, all the programs are running equivalently, the rank is used to
      distinguish the roles of the programs in the SPMD model, with rank 0 often used
      specially... */
   if(myid == 0)
   {
     printf("%d: We have %d processors\n", myid, numprocs);
     for(i=1;i<numprocs;i++)
     {
       sprintf(buff, "Hello %d! ", i);
       MPI_Send(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD);
     }
     for(i=1;i<numprocs;i++)
     {
       MPI_Recv(buff, BUFSIZE, MPI_CHAR, i, TAG, MPI_COMM_WORLD, &stat);
       printf("%d: %s\n", myid, buff);
     }
   }
   else
   {
     /* receive from rank 0: */
     MPI_Recv(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD, &stat);
     sprintf(idstr, "Processor %d ", myid);
     strcat(buff, idstr);
     strcat(buff, "reporting for duty\n");
     /* send to rank 0: */
     MPI_Send(buff, BUFSIZE, MPI_CHAR, 0, TAG, MPI_COMM_WORLD);
   }
 
   MPI_Finalize(); /* MPI Programs end with MPI Finalize; this is a weak synchronization point */
   return 0;
 }
[ IDE @ 11.10.2007. 20:35 ] @
ako kod probavas na nekom klasteru, onda bi trebao definisati job preko job definition language-a u kojem definises npr.
-na koliko nodova se kod izvrsava.
-gdje se smjestaju rezultati
-gdje se smjestaju izvjestaji o greskama
- i druge stvari...


Na kojem klasteru radis? Koliko je pouzdan?
Ja sam znao raditi na nekim klasterima koji su lose podeseni, i ne mogu dati nikakakav rezultat...



[ -pixi- @ 15.10.2007. 09:54 ] @
prezakg:
Pokusao sam da pratim tutorial, i ako je interface malo drugaciji, u datom linku i uspio do sedme tacke. Poslije toga nemogu da razjasnim kako da dodam .lib fajlove. Kao prvo pod Properties -> Linker -> Input -> Additional Dependencies sam vec dodao mpi.lib jer ne postoji mpichd.lib, a kao drugo ako pokusam da dodam ws2_32.dll (koji se nalazi u system32) onda ne moze da nadje koji god od ta dva fajla navedem kao prvi. Znaci ako napisem "ws2_32.dll, mpi.lib" ne moze naci ws2_32.dll.
Ovo sam uradio sa projektom u examples folderu i to mi na izgled radi kako treba, sada mi nije jasno kako da dalje u svoj projekat ovo uvedem!? Pomalo me je ovaj artikal zbunio jer ima puno sub projekata. Ja sam mislio da svaki projekat treba da bude poseban solution i da include koristis da importujes include i lib fajlove.

IDE:
Oprosti ako sam bio nejasan ali ne radim na clusteru nego radim na dual-core processoru i kao sto rekoh u prvoj poruci pokusavam da optimiram komponent za dual/quad -core jednog racunara. Sto takodjer znaci da bi zelio da je moguce da komponent sam "sazna" koliko processora moze da podjeli posao.

Hvala na odgovorima
[ prezakg @ 16.10.2007. 12:28 ] @
Evo malo sam progooglovao za tebe....

Neko je postavio isto pitanje na majkrosoftovom sajtu:

http://forums.microsoft.com/MS...spx?PostID=148297&SiteID=1

na zalost ne mogu to da proverim jer nemam VS 2005, pa ako ti ovo nije od pomoci postavi pitanje kako se podesava linker u VS 2005 na ovom forumu, neko ce valjda da odgovori.......

P.S. mozes i da nadjes neki gotov(podesen) projekat za MPICH za VS 2005 na net-u i da ga prepravis za svoje potrebe(zamenis sadrzaj c/c++ fajlova)
[ -pixi- @ 18.10.2007. 11:54 ] @
Hvala na odgovoru pokusacu ovo pa cu se vratiti... jer trenutno nisam u mogucnosti da ovo isprobam.