|
|
|
|
|
|
|
|
Ich werd bekloppt. Ihr kennt ja bestimmt den einfachen Monte Carlo Algorithmus um Pi zu bestimmen. Ich habe den in Julia und in C++ geschrieben und ich kriege es auf Teufel komm raus nicht hin, auch nur annährend an die Performance von Julia zu kommen. Why?
Le C++ code
|
Code: |
#include <iostream>
#include <random>
#define N_TOTAL 100000000
int main(int argc, char const *argv[]) {
unsigned long n_inside(0);
std::random_device rd;
std::mt19937_64 generator(rd());
std::uniform_real_distribution<double> distr;
for(unsigned long i=0; i < N_TOTAL; ++i) {
double x = distr(generator);
double y = distr(generator);
if(x*x + y*y < 1)
n_inside++;
}
printf("%.10f\n", (double)n_inside / N_TOTAL * 4);
return 0;
} |
|
le Julia code
|
Code: |
function compute_pi(N::Int)
n_landed_in_circle = 0
for i = 1:N
x = rand()
y = rand()
if x*x + y*y < 1.0
n_landed_in_circle += 1
end
end
return n_landed_in_circle / N * 4.0
end
println(compute_pi(100000000)) |
|
Le timings
|
Code: |
$ time ./pi_serial
3.1415853200
./pi_serial 3.78s user 0.01s system 99% cpu 3.794 total
$ time julia pi_serial.julia
3.14154468
julia pi_serial.julia 1.43s user 0.05s system 99% cpu 1.490 total
|
|
Verhält sich mit plain C und rand() auch so. Ich bin relativ sicher, dass Julia intern auch double precision und den mersenne twister nutzt. Ist std::mt19937_64 so schlecht oder was geht hier vor?
/e: mit -O3 kompiliert, gcc 6.X. -Ofast und/oder clang machen nichts aus.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 24.10.2017 14:52]
|
|
|
|
|
|
|
|
|
|
Das ist die Strafe für diese Zeile:
|
Code: |
#define N_TOTAL 100000000
|
|
|
|
|
|
|
|
|
zu c-ish oder hättest du lieber ein 1e8 gesehen? constexpr? argv[1]?
|
|
|
|
|
|
|
|
Code: |
constexpr static const unsigned long N_TOTAL = 100000000ul;
|
|
was denn sonst?
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von [CSF]Omega am 24.10.2017 15:21]
|
|
|
|
|
|
Zu c-ish, und ja constexpr oder argv[1] wäre meine Wahl gewesen. :x
Ich bin da sehr penibel (auch wenn ich immer noch nur Java code ).
|
|
|
|
|
|
|
Bottom line: Julia ist schon eigentlich ganz schön krass. Kommt natürlich nicht an C/C++ ran, aber für so eine einfache JIT Sprache ist es klasse. Kann man bestimmt locker MATLAB mit ersetzen.
|
|
|
|
|
|
|
| Zitat von PutzFrau
(auch wenn ich immer noch nur Java code ).
| |
Auch da kann man ganz anständig programmieren wenn man es diametral anders macht als Oracle.
|
|
|
|
|
|
|
@Oli: Schön, dass du Matlab erwähnst, diese Array 1er Sprachen
@SBI: Ja, das weiß ich schon, und ich würde sagen, mittlerweile bin ich ein durchaus kompetenter und effizienter Java Programmierer. Aber C++ mit Python ist halt echt schön. :x
|
|
|
|
|
|
|
| Zitat von PutzFrau
@Oli: Schön, dass du Matlab erwähnst, diese Array 1er Sprachen
| |
Du würdest lachen, wüsstest du, dass Julia auch 1 based ist.
|
|
|
|
|
|
|
| Zitat von Oli
| Zitat von PutzFrau
@Oli: Schön, dass du Matlab erwähnst, diese Array 1er Sprachen
| |
Du würdest lachen, wüsstest du, dass Julia auch 1 based ist.
| |
Deswegen mein Kommentar. Immerhin ist Julia die bessere 1er Sprache!
|
|
|
|
|
|
|
Matlab: wunderbar und fein
|
|
|
|
|
|
|
Wäre der Julia code eventuell unerhört viel schneller wenn man ihn vektorisiert (evtl in chunks wenn der ram nicht reicht) formulieren würde? Kenne mich mit Julia nicht aus, aber ich nehme an Wechsel von interpretiertem Code zu Bibliothekscode sind wie in Python auch in Julia teuer?
|
|
|
|
|
|
|
Ist doch sau schnell. Da Julia ja eh JIT compiled wird glaube ich, dass vektorisieren nicht viel bringen würde.
|
|
|
|
|
|
|
Bei Julia wird immer nur von LLVM-JIT geredet, ob die Kiste überhaupt einen Interpreter-Fallback hat?
|
|
|
|
|
|
|
| Zitat von Oli
Ist doch sau schnell. Da Julia ja eh JIT compiled wird glaube ich, dass vektorisieren nicht viel bringen würde.
| |
Würdest du mal probieren, ob Julia schneller wird, wenn du die if-Abfrage durch ein
|
Code: |
n_landed_in_circle += (x*x + y*y < 1.0)
|
|
ersetzt? Matlab hat sowas gefressen und war schneller.
Und beim Vektorisieren statt ner Schleife wars auch um ein Vielfaches schneller.
|
|
|
|
|
|
|
Matlab != Julia und das ist auch der Grund, warum das Vektorisieren so viel bringt in Matlab/Python (kann durchaus drei Größenordnungen sein).
edit: + statt if könnte allerdings tatsächlich ein wenig helfen.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von PutzFrau am 24.10.2017 19:20]
|
|
|
|
|
|
GCC macht da sehr amüsanten Code raus:
if(x*x + y*y < 1)
n_inside++;
1 lea rax, [rbx+1]
2 vmovsd xmm6, QWORD PTR .LC6[rip]
3 vmulsd xmm1, xmm1, xmm1
4 vfmadd132sd xmm0, xmm1, xmm0
5 vucomisd xmm6, xmm0
6 cmova rbx, rax
xmm1 ist offensichtlich y, xmm0 ist x. Beim Label LC6 liegt "1.0" (als zwei 32-Bit Werte):
.LC6:
.long 0
.long 1072693248
1) setzt rax = rbx (n_inside) + 1, für später.
2) holt uns also 1.0 ran,
3) ist y*y,
4) ist x*x + 3 (als FMA).
5) Vergleicht dann 4 mit unserer 1.0; das Ergebnis ist CF=0 und ZF=0 wenn xmm6 (1.0) größer als 4 ist.
6) ist ein conditional move, der rax nach rbx schreibt genau dann wenn CF=0 und ZF=0.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 24.10.2017 19:57]
|
|
|
|
|
|
Julia ist schon ziemlich geil, einer unserer Techniker schwört drauf und macht echt cooles Zeug damit. Sind mir aber definitiv noch zu viele Breaking Changes von Release zu Release als dass ich im Alltag darauf umsteigen könnte.
--
Anderes Thema, tut mal was für die Umwelt und helft dem Ökokasper. Folgende Problematik: Ich steh an Punkt X in einem Mischwald und will wissen wie viel % Baumart A, wieviel % Baumart B in verschiedenen Himmelsrichtungen stehen (bis zu einer gewissen, noch nicht festgelegten Entfernung).
Bin mir noch nicht darüber im Klaren, in welcher Form die Kartierung vorliegt, aber ich nehme mal an ich kann einfach ein Rasterbild bekommen. Ob ich die Zählung direkt grafisch mache, oder das Raster vorher in eine Matrix umwandel ist mir wurst. Das bekomme ich hin. Grafisch wäre aber vielleicht geschickter, kann auch sein, dass ich 'ne Punktwolke kriege.
Ich hab mal 'ne Skizze gemacht:
Von Hand würde ich einfach in Photoshop rumschnippeln und mir Histogramme erstellen, aber das will ich gerne vermeiden, weil ich eventuell auch mit verschiedenen Entfernungen / Radii von dem Kreis arbeiten möchte. Wie kann ich möglichst automatisiert und mit frei wählbarem Radius die farbigen Kästen in jedem Kreisabschnitt zählen? Ich steh total auf dem Schlauch. Für rechteckige Segmente würd ich's ja noch irgendwie hingedengelt kriegen.
Jedes Stichwort, nach dem ich Stackexchange durchwühlen kann hilft. /e: Achso, ist vielleicht nicht ganz irrelevant: Ich "kann" halbwegs okay Python, Matlab, und wenn ihr mich ärgern wollt R. Ist in Mathematica vermutlich ein Oneliner, aber dafür haben wir keine Lizenz mehr.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von nobody am 24.10.2017 22:40]
|
|
|
|
|
|
Ich sehe das Problem nicht, oder habe die Frage nicht kapiert: Du suchst eine Schleife, die alle Pixel eines Küchenstücks abläuft, oder, alternativ, eine Schleife, die alle Pixel durchläuft und guckt in welchem Küchenstück der Pixel liegt, damit der Baumart-Zähler des richtigen Küchenstücks hochgezählt wird? Wo ist das Problem?
Winkel zwischen Mittelpunkt und Pixel bestimmen -> du weißt in welchem Küchenstück der Pixel liegt. Dann noch kurz den Abstand überprüfen und wenn an dem Pixel ein Baum steht, den entsprechenden Zähler hochzählen.
|
|
|
|
|
|
|
| Zitat von PutzFrau
Matlab != Julia und das ist auch der Grund, warum das Vektorisieren so viel bringt in Matlab/Python (kann durchaus drei Größenordnungen sein).
edit: + statt if könnte allerdings tatsächlich ein wenig helfen.
| |
Vektorisieren in python (numpy) bedeutet einfach, dass die Schleife in C code ausgeführt wird, deshalb werden dafür auch numpy arrays benötigt. numpy.vectorize hingegen tut gar nichts, außer in Python über die Elemente zu loopen:
|
Code: |
The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop. |
|
Ein anderes Thema ist Matlab. Matlab hat sein 2007 oder so komplette JIT Unterstützung. Wieso die Loops da immer noch so krankhaft langsam sind ist echt ein Mysterium. Aber Matlab ist ja auch eine Krücke.
|
|
|
|
|
|
|
| Zitat von Rootsquash
Ich sehe das Problem nicht, oder habe die Frage nicht kapiert: Du suchst eine Schleife, die alle Pixel eines Küchenstücks abläuft, oder, alternativ, eine Schleife, die alle Pixel durchläuft und guckt in welchem Küchenstück der Pixel liegt, damit der Baumart-Zähler des richtigen Küchenstücks hochgezählt wird? Wo ist das Problem?
Winkel zwischen Mittelpunkt und Pixel bestimmen -> du weißt in welchem Küchenstück der Pixel liegt. Dann noch kurz den Abstand überprüfen und wenn an dem Pixel ein Baum steht, den entsprechenden Zähler hochzählen.
| |
Fragestellung richtig erkannt. Das Problem liegt darin, dass ich nie richtig programmieren gelernt hab und gelegentlich sowohl mathematisch als auch kreativ etwas gehemmt bin. Dein Lösungsvorschlag klingt gut, danke!
|
|
|
|
|
|
|
Indirekte Programmierfrage:
Suche eine gehostete Datenbank die ich über z.B. REST abfragen und befüllen kann.
Es geht um reine Metadaten und einfache Struktur (vglb. mit Adressbuch) und wenige Datensätze (<10MB).
Ziel ist es die Datenbank via .NET und einer Website via JS zu nutzen, eine Authentifizierung ist also nötig.
Vorhanden ist ein gehosteter MySQL-Server aber wäre auch Anbietern nicht abgeneigt. Amazon DynamoDB wäre eine Option, ist aber bzgl. Authentifizierung auf einer Website nicht so angenehm.
Ich habe hiermit experimentiert bekomme aber den AUTH nicht hin: https://github.com/mevdschee/php-crud-api
Hat irgendwer noch eine Idee oder Erfahrung mit sowas?
|
|
|
|
|
|
|
LDAP
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von csde_rats am 25.10.2017 13:15]
|
|
|
|
|
|
Hast du Vorerfahrungen in einer Programmiersprache? Weil, dann nimm einfach Framework X in dieser Sprache. Oder nimm eine DB, die Json speichern kann, und dann kannst du die REST PUTS direkt in die DB speichern.
Wenn du eh den Client code in JS schreibst, mach doch eine node.js Anwendung. Ich würde Django + DRF nehmen.
Wat. Bis er das aufgesetzt, die Konfigurations-Scheiße und Schemata verstanden und geschrieben hat, hat er seine REST Schnittstelle schon 5 mal mit MySQL implementiert.
|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Oli am 25.10.2017 13:14]
|
|
|
|
|
|
Ich bin jetzt kein Vollwert Programmierer aber arbeite eben an etwas in .NET/C#. Theoretisch könnte ich das auch alles in einer lokalen Datenbank/Dateistorage abfackeln, Ziel ist es aber manche Informationen später auch via Website anzuzeigen. Daher die Idee direkt die wenigen Daten dort abzulegen. Meine Erfahrung in JS ist vermutlich in 2h zusammengefasst ;-).
Es muss halt eine gehostete Datenbank sein, ich hab keinen root-Server sondern nur einen Shared-Server mit MySQL und da ist man etwas limitiert. Amazon DynamoDB wäre praktisch wegen direktem JSON Storage und via .NET einfach anzubinden. Ist aber wohl via JS nicht so nett aufzurufen (finde nur Beispiele bei dem man noch nen Facebook-Auth braucht und das ist mir eigentlich alles zu viel).
|
|
|
|
|
|
|
Wenn du den Auth dynamisch handlen willst, musst du glaube ich eine Anwendung auf deinem Server bereit stellen. Wenn es an diesem PHP Projekt nur am Auth hapert; stell doch spezifischere Fragen, ggf. auch da im Bug tracker.
|
|
|
|
|
|
|
| Zitat von Oli
Wenn du den Auth dynamisch handlen willst, musst du glaube ich eine Anwendung auf deinem Server bereit stellen. Wenn es an diesem PHP Projekt nur am Auth hapert; stell doch spezifischere Fragen, ggf. auch da im Bug tracker.
| |
Ja das Projekt ist irgendwie etwas wirr und mein PHP zu schlecht. Mir würde was mit 2-3 Accounts reichen, nur einer davon Schreibend, der Rest lesend. Naiv wie ich war ging ich davon aus, dass es so Dienste wie Sand am Meer gibt, aber scheinbar nicht.
|
|
|
|
|
|
|
Hmm... wenn ich meine Binary Daten in nem ASCII Format ausgebe und den Text dann zippe, müsste dann in etwa die selbe Größe wie beim bloßen blob rauskommen? Stehe mal wieder vor dem Problem mir ein Dateiformat ausdenken zu müssen
|
|
|
|
|
|
Thema: pOT-lnformatik, Mathematik, Physik XXI ( X-Ray-Edition ) |