www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

vorherige Seite 1 2  

Rome

Gepostet:
02.07.2007 14:00

   
Das ist beim Profiling rausgekommen....

	Mon Jul 02 13:57 2007 Time and Allocation Profiling Report  (Final)

Main +RTS -p -RTS

total time = 10843.80 secs (216876 ticks @ 50 ms)
total alloc = 1445,469,318,024 bytes (excludes profiling overheads)

COST CENTRE MODULE %time %alloc

resultOfMult Algorithm 65.8 62.8
addHlp SignedDigitBounded 12.2 12.6
shift SignedDigit 9.1 8.4
shiftright SignedDigit 3.6 6.2
addSDBounded SignedDigitBounded 2.1 2.0
fixPrefix SignedDigit 1.8 2.0
step Main 1.2 2.1
digValue Digit 1.2 0.2
pad SignedDigit 0.8 1.2
naiveMult Karatsuba 0.6 1.0


individual inherited
COST CENTRE MODULE no. entries %time %alloc %time %alloc

MAIN MAIN 1 0 0.0 0.0 100.0 100.0
main Main 200 1 0.0 0.0 100.0 100.0
step Main 211 131111 1.2 2.1 100.0 100.0
next Algorithm 309 32777 0.0 0.0 0.0 0.0
sdValue SignedDigit 310 32777 0.0 0.0 0.0 0.0
valueSDBounded SignedDigitBounded 312 32777 0.0 0.0 0.0 0.0
valuehlp SignedDigitBounded 313 92738 0.0 0.0 0.0 0.0
isZeroSDBounded SignedDigitBounded 314 92738 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 315 90977 0.0 0.0 0.0 0.0
sdValuehlp SignedDigit 311 51992 0.0 0.0 0.0 0.0
add SignedDigit 293 32777 0.0 0.0 2.6 2.9
addSDBounded SignedDigitBounded 299 32946 0.2 0.1 2.6 2.9
addHlp SignedDigitBounded 306 522060013 2.2 2.6 2.4 2.8
digValue Digit 308 522893680 0.2 0.1 0.2 0.1
addInit SignedDigitBounded 300 31881 0.0 0.0 0.0 0.0
digValue Digit 307 63688 0.0 0.0 0.0 0.0
fullAdd Digit 303 45819 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 305 84544 0.0 0.0 0.0 0.0
addDigit Digit 304 200613 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 302 84162 0.0 0.0 0.0 0.0
addDigit Digit 301 31881 0.0 0.0 0.0 0.0
pad SignedDigit 296 49992 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 297 63762 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 298 217560 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 294 84602 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 295 111980 0.0 0.0 0.0 0.0
sub SignedDigit 258 32777 0.0 0.0 0.0 0.0
add SignedDigit 333 16847 0.0 0.0 0.0 0.0
addSDBounded SignedDigitBounded 340 33694 0.0 0.0 0.0 0.0
addHlp SignedDigitBounded 349 1031935 0.0 0.0 0.0 0.0
digValue Digit 351 1015088 0.0 0.0 0.0 0.0
addInit SignedDigitBounded 343 16847 0.0 0.0 0.0 0.0
digValue Digit 350 33694 0.0 0.0 0.0 0.0
fullAdd Digit 346 23108 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 348 50541 0.0 0.0 0.0 0.0
addDigit Digit 347 117929 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 345 33694 0.0 0.0 0.0 0.0
addDigit Digit 344 16847 0.0 0.0 0.0 0.0
pad SignedDigit 336 33694 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 337 33694 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 338 101082 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 334 33694 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 335 134776 0.0 0.0 0.0 0.0
negSDBounded SignedDigitBounded 332 17912 0.0 0.0 0.0 0.0
negDigit Digit 339 17912 0.0 0.0 0.0 0.0
shift SignedDigit 219 505466669 2.3 2.4 3.8 3.9
fixPrefix SignedDigit 256 505420089 1.4 1.5 1.5 1.5
con2tag_Digit# Digit 257 505582968 0.1 0.0 0.1 0.0
buffn Algorithm 217 32778 0.0 0.0 92.3 91.1
newr Algorithm 218 65556 0.0 0.0 92.3 91.1
mu Algorithm 248 105041 0.0 0.0 0.0 0.0
shift SignedDigit 237 1726842008 6.6 5.7 10.2 11.9
fixPrefix SignedDigit 250 105041 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 251 105041 0.0 0.0 0.0 0.0
shiftright SignedDigit 249 1726710968 3.6 6.2 3.6 6.2
resultOfMult Algorithm 232 459207 65.8 62.8 73.1 71.0
genericReplicate Algorithm 236 446166 0.0 0.0 0.0 0.0
mult SchoenhageStrassen 233 612294 0.0 0.0 7.3 8.2
mult Karatsuba 243 586296 0.0 0.0 7.3 8.2
karatsuba Karatsuba 355 3157899 0.2 0.2 7.2 8.2
pad SignedDigit 422 1158389 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 423 1360560 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 424 1359308 0.0 0.0 0.0 0.0
sub SignedDigit 403 1360560 0.0 0.0 0.5 0.4
add SignedDigit 405 1360560 0.0 0.0 0.4 0.3
addSDBounded SignedDigitBounded 412 1360680 0.0 0.0 0.3 0.3
addHlp SignedDigitBounded 419 23889424 0.2 0.2 0.3 0.2
digValue Digit 421 44325614 0.0 0.0 0.0 0.0
addInit SignedDigitBounded 413 1360546 0.0 0.0 0.0 0.0
digValue Digit 420 2462024 0.0 0.0 0.0 0.0
fullAdd Digit 416 1846933 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 418 3663831 0.0 0.0 0.0 0.0
addDigit Digit 417 8190532 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 415 3322017 0.0 0.0 0.0 0.0
addDigit Digit 414 1360546 0.0 0.0 0.0 0.0
pad SignedDigit 408 2439635 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 409 6052518 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 410 6090676 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 406 3011044 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 407 3021210 0.0 0.0 0.0 0.0
negSDBounded SignedDigitBounded 404 1360560 0.0 0.1 0.0 0.1
negDigit Digit 411 25261794 0.0 0.0 0.0 0.0
add SignedDigit 390 2721120 0.0 0.0 1.5 1.8
addSDBounded SignedDigitBounded 396 2711487 0.2 0.1 1.3 1.4
addHlp SignedDigitBounded 425 152115126 1.0 1.2 1.1 1.2
digValue Digit 427 245863982 0.1 0.0 0.1 0.0
addInit SignedDigitBounded 397 2711387 0.0 0.0 0.1 0.1
digValue Digit 426 5350156 0.0 0.0 0.0 0.0
fullAdd Digit 400 3841879 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 402 7667634 0.0 0.0 0.0 0.0
addDigit Digit 401 17712268 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 399 7093140 0.0 0.0 0.0 0.0
addDigit Digit 398 2711387 0.0 0.0 0.0 0.0
pad SignedDigit 393 5171535 0.1 0.3 0.2 0.3
fixPrefix SignedDigit 394 5426925 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 395 5427219 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 391 6112011 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 392 6112148 0.0 0.0 0.0 0.0
shift SignedDigit 387 39496818 0.1 0.2 0.1 0.2
fixPrefix SignedDigit 388 1361420 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 389 1361420 0.0 0.0 0.0 0.0
naiveMult Karatsuba 356 14755928 0.6 1.0 5.0 5.6
add SignedDigit 364 13272639 0.1 0.1 3.8 3.9
addSDBounded SignedDigitBounded 374 11794838 0.4 0.3 2.8 2.5
addHlp SignedDigitBounded 381 232373883 1.8 1.9 2.0 1.9
digValue Digit 384 420439062 0.2 0.0 0.2 0.0
addInit SignedDigitBounded 375 11794838 0.2 0.2 0.4 0.3
digValue Digit 382 23229028 0.0 0.0 0.0 0.0
fullAdd Digit 378 17336415 0.1 0.1 0.2 0.2
con2tag_Digit# Digit 380 34668845 0.0 0.0 0.0 0.0
addDigit Digit 379 80072511 0.1 0.1 0.1 0.1
con2tag_Digit# Digit 377 31620597 0.0 0.0 0.0 0.0
addDigit Digit 376 11794838 0.0 0.0 0.0 0.0
pad SignedDigit 370 23540025 0.6 0.9 0.8 1.2
fixPrefix SignedDigit 371 87789648 0.2 0.3 0.2 0.3
con2tag_Digit# Digit 372 83649895 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 368 24289368 0.1 0.1 0.1 0.1
con2tag_Digit# Digit 369 24301942 0.0 0.0 0.0 0.0
scalMult SignedDigitBounded 362 13272639 0.1 0.0 0.4 0.5
negSDBounded SignedDigitBounded 385 4541148 0.1 0.2 0.2 0.2
negDigit Digit 386 69664513 0.1 0.0 0.1 0.0
genericReplicate SignedDigitBounded 365 4257175 0.2 0.3 0.2 0.3
con2tag_Digit# Digit 363 26261305 0.0 0.0 0.0 0.0
shift SignedDigit 359 26545290 0.1 0.1 0.1 0.1
fixPrefix SignedDigit 360 14707389 0.0 0.1 0.0 0.1
con2tag_Digit# Digit 361 14829161 0.0 0.0 0.0 0.0
isZeroSDBounded SignedDigitBounded 357 29509003 0.0 0.0 0.1 0.0
con2tag_Digit# Digit 358 40986074 0.0 0.0 0.0 0.0
pad SignedDigit 352 180508 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 353 311390 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 354 862630 0.0 0.0 0.0 0.0
scalMult SignedDigitBounded 246 87366 0.0 0.0 0.0 0.0
negSDBounded SignedDigitBounded 316 43618 0.0 0.0 0.0 0.0
negDigit Digit 342 338180 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 247 131114 0.0 0.0 0.0 0.0
isZeroSDBounded SignedDigitBounded 244 420168 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 245 486122 0.0 0.0 0.0 0.0
isZeroSDBounded SignedDigitBounded 234 459207 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 235 529774 0.0 0.0 0.0 0.0
sumUp SignedDigit 231 32778 0.0 0.0 9.0 8.1
fixPrefix SignedDigit 254 32777 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 255 30816 0.0 0.0 0.0 0.0
add SignedDigit 239 131039 0.0 0.0 9.0 8.1
addSDBounded SignedDigitBounded 322 74224 1.3 1.4 9.0 8.1
addHlp SignedDigitBounded 329 1224204892 6.9 6.8 7.7 6.8
digValue Digit 331 2446439858 0.8 0.0 0.8 0.0
addInit SignedDigitBounded 323 74224 0.0 0.0 0.0 0.0
digValue Digit 330 148448 0.0 0.0 0.0 0.0
fullAdd Digit 326 74224 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 328 148448 0.0 0.0 0.0 0.0
addDigit Digit 327 371120 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 325 148448 0.0 0.0 0.0 0.0
addDigit Digit 324 74224 0.0 0.0 0.0 0.0
pad SignedDigit 319 74224 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 320 148448 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 321 148448 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 317 148448 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 318 148448 0.0 0.0 0.0 0.0
newInAr Schedule 225 360548 0.0 0.0 0.0 0.0
newInRTypeA Schedule 226 360036 0.0 0.0 0.0 0.0
getDigits Main 212 32778 0.0 0.0 0.0 0.0
createDemoDigits Main 213 32778 0.0 0.0 0.0 0.0
makeDigit Main 215 65556 0.0 0.0 0.0 0.0
getRandom Main 214 65556 0.0 0.0 0.0 0.0
initialize Main 206 1 0.0 0.0 0.0 0.0
buffInit Algorithm 220 2 0.0 0.0 0.0 0.0
alphar Algorithm 221 3 0.0 0.0 0.0 0.0
add SignedDigit 259 2 0.0 0.0 0.0 0.0
addSDBounded SignedDigitBounded 281 2 0.0 0.0 0.0 0.0
addHlp SignedDigitBounded 288 11 0.0 0.0 0.0 0.0
digValue Digit 290 10 0.0 0.0 0.0 0.0
addInit SignedDigitBounded 282 2 0.0 0.0 0.0 0.0
digValue Digit 289 4 0.0 0.0 0.0 0.0
fullAdd Digit 285 2 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 287 4 0.0 0.0 0.0 0.0
addDigit Digit 286 10 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 284 6 0.0 0.0 0.0 0.0
addDigit Digit 283 2 0.0 0.0 0.0 0.0
pad SignedDigit 278 2 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 279 4 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 280 4 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 276 4 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 277 4 0.0 0.0 0.0 0.0
newr Algorithm 222 6 0.0 0.0 0.0 0.0
mu Algorithm 269 3 0.0 0.0 0.0 0.0
shift SignedDigit 268 11 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 271 3 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 272 3 0.0 0.0 0.0 0.0
shiftright SignedDigit 270 6 0.0 0.0 0.0 0.0
resultOfMult Algorithm 261 14 0.0 0.0 0.0 0.0
genericReplicate Algorithm 265 14 0.0 0.0 0.0 0.0
mult Naive 262 8 0.0 0.0 0.0 0.0
scalMult SignedDigitBounded 266 6 0.0 0.0 0.0 0.0
negSDBounded SignedDigitBounded 291 2 0.0 0.0 0.0 0.0
negDigit Digit 292 2 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 267 10 0.0 0.0 0.0 0.0
isZeroSDBounded SignedDigitBounded 263 14 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 264 14 0.0 0.0 0.0 0.0
sumUp SignedDigit 260 3 0.0 0.0 0.0 0.0
fixPrefix SignedDigit 274 3 0.0 0.0 0.0 0.0
con2tag_Digit# Digit 275 3 0.0 0.0 0.0 0.0
add SignedDigit 273 5 0.0 0.0 0.0 0.0
newInAr Schedule 224 31 0.0 0.0 0.0 0.0
newInRTypeA Schedule 227 9 0.0 0.0 0.0 0.0
createDemoDigits Main 207 3 0.0 0.0 0.0 0.0
makeDigit Main 209 6 0.0 0.0 0.0 0.0
getRandom Main 208 6 0.0 0.0 0.0 0.0
modeSelect Main 204 4 0.0 0.0 0.0 0.0
getMethod Main 202 6 0.0 0.0 0.0 0.0
CAF Main 194 25 0.0 0.0 0.0 0.0
step Main 216 0 0.0 0.0 0.0 0.0
initialize Main 210 0 0.0 0.0 0.0 0.0
modeSelect Main 205 2 0.0 0.0 0.0 0.0
getMethod Main 203 4 0.0 0.0 0.0 0.0
main Main 201 0 0.0 0.0 0.0 0.0
CAF Text.Read.Lex 171 8 0.0 0.0 0.0 0.0
CAF GHC.Real 168 1 0.0 0.0 0.0 0.0
CAF GHC.Read 165 2 0.0 0.0 0.0 0.0
CAF GHC.Float 164 9 0.0 0.0 0.0 0.0
CAF GHC.Handle 129 4 0.0 0.0 0.0 0.0
CAF Algorithm 120 1 0.0 0.0 0.0 0.0
CAF SignedDigit 118 6 0.0 0.0 0.0 0.0
pad SignedDigit 341 0 0.0 0.0 0.0 0.0
empty SignedDigit 238 1 0.0 0.0 0.0 0.0
CAF SignedDigitBounded 117 3 0.0 0.0 0.0 0.0
scalMult SignedDigitBounded 366 0 0.0 0.0 0.0 0.0
genericReplicate SignedDigitBounded 367 0 0.0 0.0 0.0 0.0
CAF Digit 116 3 0.0 0.0 0.0 0.0
CAF Karatsuba 115 5 0.0 0.0 0.0 0.0
mult Karatsuba 383 0 0.0 0.0 0.0 0.0
naiveMult Karatsuba 373 0 0.0 0.0 0.0 0.0
CAF Schedule 107 14 0.0 0.0 0.0 0.0
setAcStream Schedule 252 1 0.0 0.0 0.0 0.0
setAc Schedule 253 15 0.0 0.0 0.0 0.0
setAb Schedule 242 2 0.0 0.0 0.0 0.0
setAbStream Schedule 240 1 0.0 0.0 0.0 0.0
setAb Schedule 241 262165 0.0 0.0 0.0 0.0
setAa Schedule 230 5 0.0 0.0 0.0 0.0
setAaStream Schedule 228 1 0.0 0.0 0.0 0.0
setAa Schedule 229 786199 0.0 0.0 0.0 0.0
rectangleStream Schedule 223 1 0.0 0.0 0.0 0.0
CAF System.Random 105 1 0.0 0.0 0.0 0.0
CAF System.CPUTime 102 1 0.0 0.0 0.0 0.0


Gruß,
Rome
Zum Seitenanfang    
 
Siracusa

Gepostet:
02.07.2007 14:37

   
Hab dein Programm mal laufen lassen. Das Resultat war wie von dir beschrieben. Ein Blick in die Prozessliste brachte dann etwas Erleuchtung: Das Programm hatte eine Speicherauslastung von über 600MB. Smilie

Auf den ersten Blick in das Profiling-Protokoll liegt der Speicherverbraucht bei der Funktion Algorithm.resultOfMult. Aber ich werd mir den Code heute abend mal etwas genauer zu Gemüte führen.

Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Siracusa

Gepostet:
03.07.2007 01:47

   
Hallo nochmal,

zwei Stellen zum Optimieren hab ich gefunden, die laut Profiling sehr häufig durchlaufen werden:

* In der Funktion Algorithmus.resultOfMult erzeugst du eine Teilliste nach folgendem Muster: [genericIndex p (i-1) | i<-[a..b] ]. Das ist bei langen Listen p und großen Abständen a..b sehr uneffizient. genericIndex geht nämlich für jeden Index von Anfang an die ganze Liste durch, bis die entsprechende Position gefunden ist, hat also linearen Aufwand. Hier würde ich mich nicht auf eine Optimierung vom Compiler zu einem konstanen Aufwand verlassen. Zusätzlich wird durch die list comprehension eine zusätzliche Liste der Indizes erzeugt, was überflüssig ist. Da du dir ja nur eine Teilliste aus der originalen Liste "herausschneidest", kannst du mittels take und drop direkt auf die zusammenhängende Originalliste zugreifen. Obiger Ausdruck läßt sich dann zum effizienteren genericTake (b-a) (genericDrop a p) umformen.

* In der Funktion SignedDigit.shift werden u.U. große Links-/Rechts-Shifts in Einzelschritten ausgeführt. Hier könnte ich mir vorstellen, wäre ein ganzer Block-Shift mit nur einem Rekursionsaufruf ebenfalls effizienter. Beim Links-Shift ist das besonders einfach, da du nur die Kommastelle entsprechend ändern mußt. Beim Rechsshift müßte dann evtl. ein ganzer Block von 'Z'-Werten vorangestellt werden.

Das Problem mit dem Speicherallokieren lösen diese Änderungen m.E. aber nicht. Ich hab mir das Speicherverhalten des Programms noch einmal angesehen. Der benötigte Speicher bleibt bis zum unerwarteten Ende des Programms relativ gering, bei mir unter 10MB. Dann, kurz nach dem Halten, explodiert der Speicherverbrauch plötzlich ins Extreme. Daher mag ich nicht so recht an die Schuld des Garbage Collectors glauben. Die letzte berechnete Stelle liegt kurz hinter 2^15. Vielleicht wird intern irgendein Maximalwert (für Listenlängen?) überschritten, der das Programm in eine Endlosschleife stürzt, was dann die rasante Speicherallokierung zur Folge hat. Überhaupt rechnet das Programm sehr ruckelig, hält immer wieder mal für mehrere Sekunden an, bevor es weiterrechnet. Kann ich mir auch nicht wirklich erklären, woran das liegt.
Tritt das Problem eigentlich bei allen 3 Multiplikations-Algorithmen auf? Ich hab es nur mit der letzten versucht. Und versuch mal einen Durchlauf ohne die Compiler-Optimierung anzuschalten. Mehr Ideen hab ich dazu momentan leider auch nicht. Du könntest nur versuchen, den Kern des Problems durch sukzessives Rauswerfen von Quellcode zu lokalisieren.

Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Rome

Gepostet:
03.07.2007 09:49

   
Servus,
hab deine beiden Tipps ma umgesetzt, er scheint ein wenig schneller zu sein, hört aber genau an der gleichen Stelle auf 8/ .
Ich, bzw mein Kumpel hatte noch die Idee, dass es vielleicht an der Rekursionstiefe liegen könnte, da er ja eigentlich den Speicher ne freigeben dürfte, solange er im rekursiven Aufruf steckt. Werde jetzt mal versuchen die Rekursion mittels /iterate/ aufzulösen.

Habe grade was Interessantes festgestellt: Das Problem tritt beim naiven Algorithmus bereits an der Stelle 16392 bzw 16395 auf, genau dort, wo er bei den beiden anderen mittendrin auch kurz hängt, aber dann weiterrechnet. Ich poste mal die beiden Subroutinen für /Naive/ und /Karatsuba/ , den Schönhage-Strassen wird er denke noch ne verwenden, da ich den Turnoverpoint auf 8192 gesetzt habe, vorher wird dort auch /karatsuba/ benutzt.
Weiter habe ich mal mit der Funktion /Algorithm.mult/ mal die Zahl /p = genericReplicate 40000 O/ ,
also 0.1111...., im Interpreter quadriert, er hat mir am Anfang auch brav nur Einsen ausgegeben, aber später dann Nullen, was eigentlich nicht sein darf. Die können eigentlich nur auftreten, wenn er in der Funktion /Algortihm.resultOfMult/ nicht mehr entsprechend auf die beiden Eingabeparamter zugreifen kann und daher diese mit Nullen auffüllt....


-- Dieses Modul dient der Multiplikation zweier Binärzahlen in SD-Darstellung.
-- Die Zahlen stammen aus den Rechtecken des Schedulings, ihre Länge wird
-- durch die Rechtecke bestimmt.
module Naive(
mult -- :: SDBounded -> SDBounded -> SDBounded
)
where

import SignedDigit
import Data.List

-- /naiveMult/ multipliziert zwei Zahlen in SD-Darstellung miteinander, dabei werden beide Zahlen in SD-Darstellung,
-- die nur aus einem Vorkommateil bestehen, konvertiert und diese dann mittels /multhlp/ multipliziert.
mult :: SDBounded -> SDBounded -> SDBounded
mult a b
| isZeroSDBounded a || isZeroSDBounded b = []
| genericLength a == 1 = scalMult b (head a)
| genericLength b == 1 = scalMult a (head b)
| otherwise = erg
where (sd,i) = (multHlp (a,genericLength a) (b,genericLength b))
erg = sd ++ (genericReplicate (i-(genericLength sd)) Z)

multHlp :: SD -> SD -> SD
multHlp (a,i) (b,j)
| (isZeroSDBounded a) || (isZeroSDBounded b) = empty
| otherwise = add(scalMult a (last b) ,i) (multHlp (shift 1(a,i)) ((init b),j-1))



module Karatsuba(
mult -- :: SDBounded -> SDBounded -> SDBounded
)
where

import SignedDigit
import Data.List

-- /naiveMult/ multipliziert zwei SD-Darstellungen mittels des Schulalgorithmus, die Funktion stützt sich dabei auf die Hilfsfunktion
-- /scalMult/, um eine SD-Darstellung mit einem einzelnen Digit zu multiplizieren.
naiveMult :: SD -> SD -> SD
naiveMult (a,i') (b,j')
| (isZeroSDBounded a) || (isZeroSDBounded b) = empty -- ist einer der beiden Parameter gleich Null, so wird Null zurückgegeben
| otherwise = add (scalMult x (last y) ,i) (naiveMult (shift 1(x,i)) ((init y),j-1)) -- sonst wird das Ergebnis mittels
-- /scalMult/, entsprechenden Shifts und Summation bestimmt.
where (x,i) = (a++(genericReplicate (i'-(genericLength a)) Z),i') -- implizite Nullen werden für die Berechnung benötigt
(y,j) = (b++(genericReplicate (j'-(genericLength b)) Z),j') -- und angefügt

-- /mult/ multipliziert zwei SD-Darstellungen aus dem Intervall [-1,1], die Funktion stützt sich dabei auf die beiden Funktionen /karatsuba/
-- und /scalMult/. Ist einer der beiden Eingabeparamter /p/ und /q/ von der Länge eins, so wird nur eine "Skalar-Multiplikation" mittels
-- /scalMul/ durchgeführt, ansonsten wird der Karatsuba-Algorithmus zur Multiplikation der beiden Zahlen benutzt.
mult :: SDBounded -> SDBounded -> SDBounded
mult p q
| isZeroSDBounded p || isZeroSDBounded q = [] -- ist eine der beiden Zahlen gleich Null, so wird die leere SD-Darstellung zurückgegeben.
| l1 == 1 = scalMult q (head p) -- ist /p/ ein einzelnes Digit, so wird die Funktion /scalMult/ für die Multiplikation benutzt.
| l2 == 1 = scalMult p (head q) -- ist /q/ ein einzelnes Digit, so wird die Funktion /scalMult/ für die Multiplikation benutzt.
| otherwise = result
where l1 = genericLength p -- Bestimmen der Länge der Eingbabeparameter
l2 = genericLength q
(pPadded, qPadded) = pad (p,l1) (q,l2) -- falls einer der Parameter kürzer als der andere ist, werden Padding-Nullen vorne angefügt.
(karaResult,i) = karatsuba pPadded qPadded
result = karaResult++(genericReplicate (i-(genericLength karaResult)) Z) -- evtl implizite Nullen hinten an das Ergebnis anfügen

-- /karatsuba/ multipliziert zwei SD-Darstellungen mittels der Karatsuba-Methode, die Eingabeparameter /p/ und /q/ müssen gleich lang sein,
-- dies wird in der Funktion /mult/ überprüft. Um den Overhead zu vermindern wird bei einer Länge kleiner gleich 2 der normale Schulalgorithmus benutzt.
karatsuba :: SD -> SD -> SD
karatsuba (x,i) (y,j)
| i <= 16 || j <= 16 = naiveMult (x,i) (y,j) -- bei einer Länge der Parameter von kleiner gleich 16, wird der Schulalgorithmus aufgerufen
| odd i = karatsuba (Z:x,i+1) (y,j) -- der erste Eingabeparameter hat ungerade Länge, eine Null wird vorne angefügt
| odd j = karatsuba (x,i) (Z:y,j+1) -- der zweite Eingabeparameter hat ungerade Länge, eine Null wird vorne angefügt
| otherwise = ( (shift n x1y1) `add` (shift m middle) ) `add` x0y0 -- sonst kann der Algorithmus ausgeführt werden
where n = if i==j then i else error "arguments must have same length"
m = div n 2 -- /m/ ist ganzzahlig, da zuvor geprüft wurde, ob /n/ durch /2/ teilbar ist.
(x1,x0) = genericSplitAt m x -- Zahlausschnitte /x1/ und /x0/ mit /x = x1*2^m + x0/
(y1,y0) = genericSplitAt m y -- Zahlausschnitte /y1/ und /y0/ mit /y = y1*2^m + y0/
middle = add(add x1y1 x0y0) x1x0y0y1 -- Zusammensetzen der rekursiven Aufrufe
x1y1 = karatsuba (x1,m) (y1,m) -- rekursiver Aufruf mit den Zahlausschnitten /x1/ und /y1/
x0y0 = karatsuba (x0,m) (y0,m) -- rekursiver Aufruf mit den Zahlausschnitten /x0/ und /y0/
x1x0y0y1 = karatsuba x1x0 y0y1 -- rekursiver Aufruf mit den "gemischten" Zahlausschnitten
(x1x0,y0y1) = pad (sub (x1,m) (x0,m)) (sub (y0,m) (y1,m)) -- da bei der Differenzbildung der
-- "gemischten" Ausdrücke auch ein Übertrag entstehen kann (Signed-Digit-Darstellung!), müssen
-- die Ergebnisse wieder gleichlang gemacht werden.


Also auch ohne Optimierungsoption hängt er an genau der gleichen Stelle...


Gruß,
Rome
Zum Seitenanfang    
 
Rome

Gepostet:
03.07.2007 19:52

   
Also,

mein Kumpel hats mal unter Linux compiliert und folgendes festgestellt:

32779 : 1 1 ---32776--> 0
32780 : 1 0 ---32777--> -1
Main: Ix{Integer}.index: Index (32766) out of range ((0,32765))

Werde das morgen dann mal genauer unter die Lupe nehmen, hab trotzdem vielen dank für deine Mühe...

Gruß,
Rome
Zum Seitenanfang    
 
Rome

Gepostet:
04.07.2007 11:29

   
So,

hab mal wieder was neues herausgefunden:

Habe sämtliche Typen /Integer/ ind /Int/ umgeschrieben und nutze nun die normalen /Prelude/ Listenfuktionen anstelle der /generics/ . Bisher ist er bei über 36000....

mittlerweile bei über 100K....

Gruß
Rome
Zum Seitenanfang    
 
Siracusa

Gepostet:
04.07.2007 18:53

   
Offensichtlich sind die generic-Funktionen für größere Datenmengen ungeeignet:

Prelude> length [1..1000000]
1000000
Prelude> Data.List.genericLength [1..1000000]
*** Exception: stack overflow


Mich würde mal die Speicherauslastung des Programms bei Stelle 100.000 interessieren, ist die durch die Ersetzung gesunken oder allokiert er immer noch gigantische Speichermengen?

Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Rome

Gepostet:
04.07.2007 21:51

   
Soeben hat mein Programm die 200.000 Marike geknackt und die Speicherauslastung sieht wie am Anfang aus, es sind vielleicht nur sehr sehr wenige MB dazu gekommen, aber diese Explosion, wie zuvor, ist definitiv nicht eingetreten. Meine Windows-Auslagerungsdatei ist bei 368MB, mit sowas um den Dreh hat er heute Vormittag angefangen und rechnet immer noch brav weiter....

Gruß,
Rome
Zum Seitenanfang    
 
Rome

Gepostet:
05.07.2007 07:28

   
Hab den Rechner über Nacht laufen lassen und er rechent immer noch, ist nu bei stelle 279500 und Auslagerungsdatei bei 408MB.
Weiter hab ich das rausgefunden:

Prelude> Data.List.foldl (+) 0 $ map (const 1) [1..1000000] :: Int
*** Exception: stack overflow
Prelude> Data.List.foldl' (+) 0 $ map (const 1) [1..1000000] :: Integer
1000000

Scheint wohl an dem fold zu liegen.....
Zum Seitenanfang    
 
Rome

Gepostet:
05.07.2007 15:45

   
Ich hab glaube den Übeltäter:

Weil i zu dumm zum testen war, hab ich anscheinend doch nur den Karatsuba getestet, weil ich heute nochmal alles von vorne quasi aufgebaut habe und beim karatsuba läufts auch mit integer durch.....
Den Speicher verbraucht die FFT beim SchönhageStrassen, muss jetzt nur noch dort drin den Fehler finden....

Sry.....
Zum Seitenanfang    
 

vorherige Seite 1 2