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

Byte karşılığı


Phoenixlin

Öne çıkan mesajlar

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
Link to comment
Sosyal ağlarda paylaş

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;
}

Link to comment
Sosyal ağlarda paylaş

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?
Link to comment
Sosyal ağlarda paylaş

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);
}
}

Link to comment
Sosyal ağlarda paylaş

"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.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...