Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Öne çıkan mesajlar

Mesaj tarihi:
Şimdik length'in integer 1000 olduğu bir ortamda; bu length'in byte olarak değeri nedir? 1000*4(int, C'de 4 byte'a tekabül ettiği için) olmaz mı? Yoksa aralarına bir şeyler daha eklemem gerekir mi?
(Evet gene ödev yapıyorum. Bu sefer MPI'da salak saçma işler peşindeyim =))
Mesaj tarihi:
Neyse buldum stackoverflowdan ilacımı :D


int numberOfBytesForNumber(int i) {
int bytes = 0;
int div = 1;
while(i / div) {
bytes++;
div *= 256;
}
if(i % 8 == 0) return bytes;
return bytes + 1;
}


Ya şu an ödevimde yapmaya çalıştığım şey iki processor arasında işte length'i 1000'den 1000000'e kadar mesajlar gödnerip, onun round trip time'ını bulmaya kasıyorum.
Hocada ortaya bi formül atmış time = latency + length * bandwith diye. Bandwith'i de byte/sec isteyince kafam durdu, biraz beynim ısındı falan =)

Bu arada bandwith'i de (mesajın uzunluğu)/(bir mesajın gidip gelme süresi) olarak aldım. Umarım yanlış değildir. Değildir di mi? =d
Mesaj tarihi:
Belleğe adresleme yapacaksan pointer'ın da farklıydı sanırım.
Ama integer'sa 4, double'sa 8 byte.


Mesaj uzunluğu için de dediğin bandwidth = toplambyte/elapsedtime olması gerek diye düşündüm bir an.
Mesaj tarihi:
Yazdığım kodu da atayım buraya. Google'dan gelecek nesiller aranırsa acı çekmesin:



#include <stdio.h>
#include "mpi.h"

#define proc_A 0
#define proc_B 1
#define ping 101
#define pong 101

#define LENGTH 1000
#define NUM_REPEATS 1000

int buffer[LENGTH];

void processor_A(void);
void processor_B(void);

int main(int argc, char *argv[])
{
int rank, size;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Barrier(MPI_COMM_WORLD);
if (rank == proc_A) processor_A();
else if (rank == proc_B) processor_B();

MPI_Finalize();
return 0;
}

void processor_A(void)
{
int i;
MPI_Status status;
double start, finish, time;
double latencyS, latencyF, latency;
extern int buffer[LENGTH];
double bandwith, totalTime;

printf("LengthtTotal Timetn");

latencyS = MPI_Wtime();
for (i = 1; i <= NUM_REPEATS; i++){
MPI_Send(buffer, 1, MPI_INT, proc_B, ping, MPI_COMM_WORLD);
MPI_Recv(buffer, 1, MPI_INT, proc_B, pong, MPI_COMM_WORLD, &status);
}
latencyF = MPI_Wtime();

latency = latencyF - latencyS;

start = MPI_Wtime();

for (i = 1; i <= NUM_REPEATS; i++){
MPI_Send(buffer, LENGTH, MPI_INT, proc_B, ping, MPI_COMM_WORLD);
MPI_Recv( buffer, LENGTH, MPI_INT, proc_B, pong, MPI_COMM_WORLD, &status);
}

finish = MPI_Wtime();
time = finish - start;
bandwith = numberOfBytesForNumber(LENGTH)/time;

totalTime = latency + LENGTH * bandwith;

printf("%dt%ftn", LENGTH, totalTime);
}

void processor_B(void)
{
int i;
MPI_Status status;
extern int buffer[LENGTH];

for (i = 1; i <= NUM_REPEATS; i++) {
MPI_Recv( buffer, 1, MPI_INT, proc_A, ping, MPI_COMM_WORLD, &status);
MPI_Send(buffer, 1, MPI_INT, proc_A, pong, MPI_COMM_WORLD);
}

for (i = 1; i <= NUM_REPEATS; i++) {
MPI_Recv( buffer, LENGTH, MPI_FLOAT, proc_A, ping, MPI_COMM_WORLD, &status);
MPI_Send(buffer, LENGTH, MPI_FLOAT, proc_A, pong, MPI_COMM_WORLD);
}
}

int numberOfBytesForNumber(int i) {
int bytes = 0;
int div = 1;
while(i / div) {
bytes++;
div *= 256;
}
if(i % 8 == 0) return bytes;
return bytes + 1;
}

Mesaj tarihi:
http://stackoverflow.com/questions/5334273/algorithm-to-figure-out-how-many-bytes-are-required-to-hold-an-int

Şurda yazılmışlardna bir kaçını daha denedim sonuç değişmedi işin aslı =) Neyse raporunu yazayım artık da kurtulayım şu ödevden
Mesaj tarihi:
Phoenixlin said:

Şimdik length'in integer 1000 olduğu bir ortamda


şunu bir açıklar mısın? sanki doğru yapmamışsın gibi geliyor bana. yüksek lisansımın %90'ı paralel programlama üzerine kurulu. yardımcı olabileceğimi düşünüyorum. ayrıca compile ederken inline flag'ini kullanıyor musun?
Mesaj tarihi:
Ehe tabi ben kodu buraya attımda sonra test aşamasında patladı :d(10^6 uzunluğundaki mesajı 10^5'dan 10 kat daha hızlı gönderince bir yerlerde yanlış yapıyorum dedim =d)

LENGTH*sizeof(int) satırı yetiyormuş bana =) Tabii asıl arada atladığım step; for loop'u içinde mesaj gönderme zamanını toplamak(latency += delta1 gibi) yerine bodoslama latency = finishTime-startTime alıyomuşum.

Kod, şağıdaki haliyle olması gerektiği gibi çalışıyor. En azından googledan bulduğum grafiklerle aşağı yukarı aynı davranışı sergiliyor =)



#include <stdio.h>
#include "mpi.h"

#define proc_A 0
#define proc_B 1
#define ping 101
#define pong 101

#define LENGTH 1000
#define NUM_REPEATS 1000

int buffer[LENGTH];

void processor_A(void);
void processor_B(void);

int main(int argc, char *argv[])
{
int rank, size;

MPI_Init(&argc, &argv);

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
MPI_Barrier(MPI_COMM_WORLD);
if (rank == proc_A) processor_A();
else if (rank == proc_B) processor_B();

MPI_Finalize();
return 0;
}

void processor_A(void)
{
int i;
MPI_Status status;
double start, finish;
double latencyS, latencyF, latency, avgLatency;
extern int buffer[LENGTH];
double bandwith, totalTime, avgBandwith;
double totalBandwith = 0.0;
double delta1, delta2;
printf("LengthtLatencyttBandwidthttRTTtn");


for (i = 1; i <= NUM_REPEATS; i++){
latencyS = MPI_Wtime();
MPI_Send(buffer, 1, MPI_INT, proc_B, ping, MPI_COMM_WORLD);
MPI_Recv(buffer, 1, MPI_INT, proc_B, pong, MPI_COMM_WORLD, &status);
latencyF = MPI_Wtime();
delta1 = latencyF- latencyS;
latency += delta1;
}
avgLatency = latency/NUM_REPEATS;


for (i = 1; i <= NUM_REPEATS; i++){
start = MPI_Wtime();
MPI_Send(buffer, LENGTH, MPI_INT, proc_B, ping, MPI_COMM_WORLD);
MPI_Recv( buffer, LENGTH, MPI_INT, proc_B, pong, MPI_COMM_WORLD, &status);
finish = MPI_Wtime();
delta2 = finish-start;
bandwith =(double)(LENGTH*sizeof(int))/delta2;
totalBandwith += bandwith;
}
avgBandwith = totalBandwith/NUM_REPEATS;

totalTime = avgLatency + LENGTH * avgBandwith;

printf("%dt%ft%ft%ftn", LENGTH, avgLatency, avgBandwith, totalTime);
}

void processor_B(void)
{
int i;
MPI_Status status;
extern int buffer[LENGTH];

for (i = 1; i <= NUM_REPEATS; i++) {
MPI_Recv( buffer, 1, MPI_INT, proc_A, ping, MPI_COMM_WORLD, &status);
MPI_Send(buffer, 1, MPI_INT, proc_A, pong, MPI_COMM_WORLD);
}

for (i = 1; i <= NUM_REPEATS; i++) {
MPI_Recv( buffer, LENGTH, MPI_FLOAT, proc_A, ping, MPI_COMM_WORLD, &status);
MPI_Send(buffer, LENGTH, MPI_FLOAT, proc_A, pong, MPI_COMM_WORLD);
}
}

Mesaj tarihi:
program yazarken genel alışkanlık olsun, mpi comm size'ın 2 olmasını zorunlu kılmışsın aslında, öyle değilse direk programdan çıkartan bir if condition koysana.
Mesaj tarihi:
şurada hata var sanki, kafam da durdu biraz ama

said:

totalTime = avgLatency + LENGTH * avgBandwith;

avgBandwidth i buldun, oki. x kb veriyi göndermen için gereken zaman length/avgbandwidth olmalı. cidden günlerdir uyumuyorum düzgün, hata yapıyo da olabilirim ama bi düşün.
Mesaj tarihi:
"The time for sending a message can be modeled by time = latency+n*bandwidth where latency is the time to send zero length message, and bandwidth is the capacity of the network (bytes/sec). Do you observe a linear relationship (that is, roundtrip time is linear function of n."

Time formülünü şu şekilde vermişti hoca ödev sourusunda. O yüzden çarptıydım.
Mesaj tarihi:
Birimler bile tutmuyor ki carparsan.

Time (sec) = Latency (sec) * length (bytes) * bandwidth (bytes/sec)

Bolersen tutacak ama. Zaten soyle dusun, bandwidth ne kadar genisse gondermen o kadar kisa surmeli.
×
×
  • Yeni Oluştur...