Phoenixlin Mesaj tarihi: Aralık 7, 2012 Mesaj tarihi: Aralık 7, 2012 Ş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 =))
mulgear6 Mesaj tarihi: Aralık 7, 2012 Mesaj tarihi: Aralık 7, 2012 kafam hoş okuyamadım tam olarak http://stackoverflow.com/questions/3447735/convert-int-to-byte-in-c işini görür mü?
Eralpb Mesaj tarihi: Aralık 7, 2012 Mesaj tarihi: Aralık 7, 2012 o integer 1000 integer[1000] demek ise aralarina bir sey eklemen gerekmez allocated memory 4000 byte olur.
SpiderS_DangeR Mesaj tarihi: Aralık 7, 2012 Mesaj tarihi: Aralık 7, 2012 Phoenixlin said: bu length'in byte olarak değeri nedir? Ne demeye çalıştın anlamadım?
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Mesaj tarihi: Aralık 7, 2012 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
Nazca Mesaj tarihi: Aralık 7, 2012 Mesaj tarihi: Aralık 7, 2012 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.
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Mesaj tarihi: Aralık 7, 2012 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; }
Eralpb Mesaj tarihi: Aralık 7, 2012 Mesaj tarihi: Aralık 7, 2012 Bence numberOfBytesForNumber is wrong on so many levels veya benim kafam cidden karismis da olabilir.
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Mesaj tarihi: Aralık 7, 2012 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
nameless Mesaj tarihi: Aralık 7, 2012 Mesaj tarihi: Aralık 7, 2012 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?
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Mesaj tarihi: Aralık 7, 2012 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); } }
fizban Mesaj tarihi: Aralık 12, 2012 Mesaj tarihi: Aralık 12, 2012 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.
fizban Mesaj tarihi: Aralık 12, 2012 Mesaj tarihi: Aralık 12, 2012 ş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.
Phoenixlin Mesaj tarihi: Aralık 13, 2012 Konuyu açan Mesaj tarihi: Aralık 13, 2012 "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.
fizban Mesaj tarihi: Aralık 13, 2012 Mesaj tarihi: Aralık 13, 2012 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.
Phoenixlin Mesaj tarihi: Aralık 13, 2012 Konuyu açan Mesaj tarihi: Aralık 13, 2012 Orası öyle de o konuda attığım maile cevap alamayınca; olduğu gibi bırakmayı tercih ettim =)
Öne çıkan mesajlar