Element-Weise Operationen in C++
Gibt es eine bereits vorhandene Bibliothek, das möchte ich erstellen array-ähnlichen Objekten, welche folgende Eigenschaften haben:
- Laufzeit Größe Spezifikation (gewählt am instantition, nicht vergrößert oder verkleinert, danach)
- Operatoren überladen zu führen element Weise Vorgänge (z.B.
c=a+b
wird das Ergebnis in einem Vektorc
mitc[i]=a[i]+b[i]
für allei
, und ähnlich für*
,-
,/
etc) - Einen guten Satz von Funktionen, die wirken elementweise, zum Beispiel
x=sqrt(vec)
haben Elementex[i]=sqrt(vec[i])
- Bieten "Zusammenfassung" - Funktionen wie
sum(vec)
,mean(vec)
etc - (Optional) - Operationen gesendet werden kann, eine GPU für die Verarbeitung.
Im Grunde so etwas wie der Weg arrays arbeiten in Fortran, mit allen von der Implementierung verborgen. Derzeit bin ich mit vector
von der STL und manuell durch überladen der Operatoren, aber ich fühle mich wie dies wahrscheinlich ein problem gelöst.
- Wahrscheinlich können Sie versuchen, Eigen library.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In den staubigen Ecken der standard-Bibliothek, längst vergessen von allen, sitzt eine Klasse namens
valarray
. Schauen Sie es oben und sehen, ob es Ihren Bedürfnissen entspricht.Vom manual-Seite an cppreference.com:
Einen code-Schnipsel zur Veranschaulichung:
Ausgabe:
2 4 6 8 10
Können Sie Cilk Plus Erweiterungen ( https://www.cilkplus.org/ ), dass stellt die array-notation, die durch Anwendung von element-Weise Operationen auf arrays die gleiche Form für C/C++. Es beschäftigt sich mit der Vektor-Parallelität von Ihrem Prozessor sowie der co-Prozessor.
Beispiel:
Standard-C-code:
Cilk-Plus - Array-notation:
Stride Abschnitte wie:
Können Sie Ermäßigungen auf arrays Abschnitte:
Interesse Lesen:
http://software.intel.com/en-us/articles/getting-started-with-intel-cilk-plus-array-notations
Die Thrust-Bibliothek, die Teil des CUDA-Toolkits, stellt eine STL-ähnliche Schnittstelle für Vektor-Operationen auf GPUs. Es hat auch eine OpenMP-back-end, jedoch die GPU-Unterstützung nutzt CUDA, so dass Sie nur auf NVIDIA-GPUs. Sie haben Ihre eigene " Verpackung der Produkte (z.B. mit expression templates), wenn Sie wollen, haben Ausdrücke wie c=a+b arbeiten für Vektoren
https://code.google.com/p/thrust/
Den VienaCL Bibliothek nimmt eine weitere high-level-Ansatz, die Bereitstellung von Vektor-und matrix-Operationen, wie Sie wollen. Es ist sowohl für CUDA-und OpenCL-back-ends, so dass Sie verwenden können, GPUs (und multi-core-CPUs) von verschiedenen Anbietern.
http://viennacl.sourceforge.net/
Den vexcl library sieht auch sehr vielversprechend (auch wieder mit Unterstützung für OpenCL und CUDA)
https://github.com/ddemidov/vexcl