Forum: Diğer Konular RSS
Feci bir programlama veya derleyici hatası!
Go Lang
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Feci bir programlama veya derleyici hatası!
// Concurrent computation of pi.
// See http://goo.gl/ZuTZM.
//
// This demonstrates Go's ability to handle
// large numbers of concurrent processes.
// It is an unreasonable way to calculate pi.
package main
 
import (
    "fmt"
    "math"
)
 
func main() {
    fmt.Println(pi(5000))
}
 
// pi launches n goroutines to compute an
// approximation of pi.
func pi(n int) float64 {
    ch := make(chan float64)
    for k := 0; k <= n; k++ {
        go term(ch, float64(k))
    }
    f := 0.0
    for k := 0; k <= n; k++ {
        f += <-ch
    }
    return f
}
 
func term(ch chan float64, k float64) {
    ch <- 4 * math.Pow(-1, k) / (2*k + 1)
}
Bu kodu dilin resmi sitesinden aldım ve Fedora 16 x 64 bir sistemde go 1.0 ile derledim. Tabi sınırları görebilmek için döngü sayısına 3-4 sıfır daha ekliyoruz. Sonuç feci, sistemdeki 8 GB. hafızayı bir anda tüketti, yetmedi 6,6 GB.'da takas dosyasını şişirdi!

Sanırım aynı kodu D'de yapsaydık böyle bir şey olmayacaktı...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
std.parallelism modülünün belgesinde kullanılan örnek de pi'yi hesaplar. Bir örnek Synopsis'te var bir tane de WorkerLocalStorageStorage'in altında:

  http://dlang.org/phobos/std_parallelism.html

Dener misin, acaba D'de de sorun oluyor mu?

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Büyük biz zevkle...:)

Sanırım bahsettiğin algoritma Go ile hemen hemen aynı ve sadece writefln() ile ilgili şeyleri ekledim:

import std.algorithm, std.parallelism, std.range, std.stdio;
 
void main() {
 
// Parallel reduce can be combined with std.algorithm.map to interesting
// effect. The following example (thanks to Russel Winder) calculates
// pi by quadrature using std.algorithm.map and TaskPool.reduce.
// getTerm is evaluated in parallel as needed by TaskPool.reduce.
//
// Timings on an Athlon 64 X2 dual core machine:
//
// TaskPool.reduce: 12.170 s
// std.algorithm.reduce: 24.065 s 
 
    immutable n = 1_000_000;
    immutable delta = 1.0 / n;
 
    real getTerm(int i) {
        immutable x = ( i - 0.5 ) * delta;
        return delta / ( 1.0 + x * x );
    }
 
    immutable pi = 4.0 * taskPool.reduce!"a + b"(
                   std.algorithm.map!getTerm(iota(n))
                );
    writefln("%.9f", pi);
}
Çıktısı:
[salih@telyeweb GO]$ dmd -release pi
[salih@telyeweb GO]$ time ./pi
3.141594654

real    0m0.018s
user    0m0.053s
sys     0m0.002s


Sanırım sonucu vermeye gerek yok çünkü böyle bir ölümcül hata karşısında dmd'nin yaptığı sadece, mütevazı bir şekilde ve saniyeler için pi demek...:)

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Tekrar denedim ve sistem kararsızlaştıp edata kilitlenme seviyesine ulaşmadı... :rolleyes:

Ancak gnome-system-monitor ile baktığımda 6.6 GB belleği hesaplama süresi içinde yediğini ve legal bir şekilde geri verdiğini gözlemledim! Bence yine ciddi bir hata ki işlem sonuçları şöyle:

[salih@telyeweb GO]$ ls -al
toplam 876
drwxrwxr-x.  2 salih salih   4096 Nis 23 08:36 .
drwx--x---+ 59 salih salih   4096 Nis 23 08:19 ..
-rw-rw-r--.  1 salih salih     77 Nis 22 22:21 hello.go
-rw-rw-r--.  1 salih salih    115 Nis 22 22:18 hello.go~
-rwxrwxr-x.  1 salih salih 640726 Nis 23 08:36 pi
-rw-rw-r--.  1 salih salih    759 Nis 23 08:36 pi.d
-rw-rw-r--.  1 salih salih    759 Nis 23 08:36 pi.d~
-rw-rw-r--.  1 salih salih    599 Nis 23 08:32 pi.go
-rw-rw-r--.  1 salih salih    599 Nis 22 22:55 pi.go~
-rw-r--r--.  1 salih salih 209200 Nis 23 08:36 pi.o
-rw-rw-r--.  1 salih salih   2676 Nis 22 22:32 solitaire.go

[salih@telyeweb GO]$ go build pi.go
[salih@telyeweb GO]$ ls pi -al
-rwxrwxr-x. 1 salih salih 1285910 Nis 23 08:47 pi
[salih@telyeweb GO]$ time ./pi
3.1415946535856922

real    0m1.946s
user   0m0.968s
sys    0m0.861s
Neredeyse bir saniye sürüyor ve Go da GC kullanıyor. Ancak dosya boyutu D'ye göre iki kat fazla 1 disket (3½HD) boyutlarında...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Denemeler için teşekkürler.

Ali
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Estağfirullah, denenecek çok şey var da ne vakit ne de onları unutmayacak akıl var bende...:)

Bu arada sabah evden çıkmadan evvel bir şey daha denedim. Döngü sayısını 2 milyona çıkardım ve dolayısıyla süre iki kat arttı. İşte o zaman bir şeyler yine yolunda gitmemeye başladı; Go için söylüyorum...

Sanırım olay bellek kapasitesinin sınırına geldiğinde takasa yedeklemesi ve artık ne yapıyorsa takas dahil her şeyi deli gibi kullanmak istemesi. Bir yandan takastaki hafızaya geliyor, kullanıyor sonra yine takasa yükleniyor. Bu böyle gidiyor ve benim sistemi kararsızlaştırıyor. Mouse hareketi dahil hiç bir şey yapamıyorum...:(

İmkanı olan kendi sisteminde de deneyebilir mi? Çünkü bu belki Go'nun değil benim donanımın sorunudur...

İşin bir diğer ilginci saniye dolmadan GB'larca RAM alanını nasıl üstüne alıyor anlamadım! Buna benzer şeyleri (hafızayı gereksizce israf eden uygulamalar!) daha önce yapmıştım ve hafızanın dolması uzun bir vakit alıyordu. Neyse ki D'de sağlam bir GC var ve bu sorunlar olmuyor...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 00:32:14 (UTC -08:00)