Phoenixlin Mesaj tarihi: Aralık 7, 2012 Paylaş 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 =)) Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
mulgear6 Mesaj tarihi: Aralık 7, 2012 Paylaş 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ü? Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Eralpb Mesaj tarihi: Aralık 7, 2012 Paylaş Mesaj tarihi: Aralık 7, 2012 o integer 1000 integer[1000] demek ise aralarina bir sey eklemen gerekmez allocated memory 4000 byte olur. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
SpiderS_DangeR Mesaj tarihi: Aralık 7, 2012 Paylaş Mesaj tarihi: Aralık 7, 2012 Phoenixlin said: bu length'in byte olarak değeri nedir? Ne demeye çalıştın anlamadım? Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Paylaş 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 Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Nazca Mesaj tarihi: Aralık 7, 2012 Paylaş 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. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Paylaş 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; } Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Eralpb Mesaj tarihi: Aralık 7, 2012 Paylaş Mesaj tarihi: Aralık 7, 2012 Bence numberOfBytesForNumber is wrong on so many levels veya benim kafam cidden karismis da olabilir. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Paylaş 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 Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
nameless Mesaj tarihi: Aralık 7, 2012 Paylaş 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? Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Phoenixlin Mesaj tarihi: Aralık 7, 2012 Konuyu açan Paylaş 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); } } Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
fizban Mesaj tarihi: Aralık 12, 2012 Paylaş 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. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
fizban Mesaj tarihi: Aralık 12, 2012 Paylaş 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. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Phoenixlin Mesaj tarihi: Aralık 13, 2012 Konuyu açan Paylaş 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. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
fizban Mesaj tarihi: Aralık 13, 2012 Paylaş 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. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Phoenixlin Mesaj tarihi: Aralık 13, 2012 Konuyu açan Paylaş Mesaj tarihi: Aralık 13, 2012 Orası öyle de o konuda attığım maile cevap alamayınca; olduğu gibi bırakmayı tercih ettim =) Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Öne çıkan mesajlar