Forum: FPGA, VHDL & Co. High Level Synthese aus C Code Spielerei oder ernste Anwendungen?


von Hußnätter (Gast)


Lesenswert?

Hallo, die Unis forschen ja an lauter Projekten, die aus C Code 
automatisch Hardware erstellen, die parallel zu einem Prozessor läuft 
und diesen beschleunigt.

Auch gibt es diverse Neukreationen von Hochsprachen, die sich dann zu 
Verilog/VHDL Code konvertieren lassen.

Gibt es Firmen, die das nutzen und damit Geld verdienen?
Oder sind alle ernsthaften Projekte immernoch in einer normalen HDL 
erstellt?

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Ja, die gibt es. Auch Versuche dieser Art gibt es. Xilinx selbst bietet 
es bekanntlich an.

Die Thematik mündet aber immer wieder in dasselbe Ergebnis:

1) Der Aufwand zur Beschreibung eines Systems wird nicht geringer, wenn 
man die Sprache austauscht. Was an Informationen einem Synthestool 
mitgegeben werden muss, bleibt gleich.

2) C und C++ haben nicht die Mächtigkeit, um Systeme so zu formulieren, 
wie s nötig ist und müss(t)en erweitert werden. Das gibt es, bringt, 
aber wegen 1 keinen Vorteil bei der Systembeschreibung.

3) C ist am Ende nicht einfacher, als VHDL, wo es alles Benötigte schon 
gibt. C ist lediglich besser bekannt. Aber das ändert sich bekanntlich, 
weil immer mehr VHDL kennen.


C hat dann seine Berechtigung, wenn man sich Dinge beim Modellieren 
ersparen kann, weil sie in C einfacher zu formulieren sind oder man auf 
Vorhandenes zurückgreifen kann-

In Einzelfällen lassen sich in C Funktionen auf DSP-Plattformen 
prototypen bevor sie ins FPGA kommen, statt sie zu Simulieren. IN den 
meisten Fällen, müssen diese aber in eine Hardwareübersetzt werden.

In nur wenigen Fällen bleibt dabei die Ablaufstruktur von C erhalten und 
kann 1:1 gewandelt werden. Meistens muss die Struktur geändert werden. 
Parallelisieung und pipelining sind hier entscheidend. Das ist in C und 
speziell in C++ möglich, aber der Schritt dahin muss in beiden Sprachen 
gegangen werden und ist logischerweise vom Denk- und Planungsaufwand das 
gleiche. Automatisch geht da nicht. Es muss immer in irgendeiner Form 
eine Vorgabe gemacht werden, damit das Tool  die richtige Lösung 
auswählen kann.

In FPGAs gibt es erheblich mehr Freiheitsgrade!

Wenn das Verständnis für die Abläufe und Notwendigkeiten der Struktur 
aber vorliegt, ist die Lösung ausgewählt, ohne mit viel Aufwand das tool 
in diese Ecke zu bewegen. Das Formulieren in VHDL ist ein Klacks. Sind 
ja nur ein paar Befehle. Der Vorteil der Verwendung von C und LIBs und 
vorgefertigten Formeln ist natürlich da, wird aber immer kleiner, weil 
auch in VHDL heute nur noch Cores reingeschmissen und angeschlossen 
werden.

Man darf also nicht erwarten, dass die Welt einfacher wird, nur weil man 
in C++ Objekte definiert, deren Verhalten und Beschreibung dem 
C-Programmierer geläufiger sind, als VHDL und man sich dann Arbeit oder 
Kosten sparen könnte. Das ist nicht der Fall.

Soweit es Vorteile gibt, werden die täglich kleiner.

von Klakx (Gast)


Lesenswert?

heute würde ich es nicht mehr als Spielerei bezeichnen. In Bereichen der 
Narichtentechnik und Signalverarbeitung wird dies schon erfolgreich 
verwendet.
Des Weiteren ist es auch zum Auslagern von zeitaufwendigen 
Software-Funktionen sinnvoll.

Natürlich verliert man Freiheitsgrade, aber das gab es auch von 
Assember->C oder "Gatter-setzen"->VHDL. Man gewinnt Zeit. Die höhere 
Abstraktion durch HLS ermöglicht es viel besser verschiedene 
Design-Auslegungen zu vergleichen oder automatisch optimieren zu lassen.

In VHDL wäre es beispielsweise viel zeitaufwendiger die Anzahl von 
Pipeline-Stufen zu ändern und das Design damit paralleler abarbeiten zu 
lassen.

Hußnätter schrieb:
> Gibt es Firmen, die das nutzen und damit Geld verdienen?
> Oder sind alle ernsthaften Projekte immernoch in einer normalen HDL
> erstellt?

https://semiwiki.com/tag/catapult/
hier findet man viele Artikel, wo Firmen HLS kommerziell im ASIC-Bereich 
einsetzen.

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Klakx schrieb:
> In VHDL wäre es beispielsweise viel zeitaufwendiger die Anzahl von
> Pipeline-Stufen zu ändern und das Design damit paralleler abarbeiten zu
> lassen.
Die pipeline Stufen ergeben sich aus den Anforderungen der Synthese und 
der Fähigkeiten des FPGAs. Die müssen nicht geändert werden, sondern 
können von der Synthese automatisch verteilt werden, wenn man es richtig 
formuliert.

Einfach ein paar FFs drauf un fertig.

Klakx schrieb:
> Man gewinnt Zeit. D

Ich erbitte ein Bespiel für einen C-Code, der kürzer ist, als das 
gleichwertige Pendant in VHDL.

von Bernd K. (prof7bit)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #5887104:
> Ich erbitte ein Bespiel für einen C-Code, der kürzer ist, als das
> gleichwertige Pendant in VHDL.

Oh, jetzt wirds interessant! Ich hoffe auf eine rege Flut von Beispielen 
und Gegenüberstellungen so daß man als VHDL- und FPGA-Unkundiger mal 
einen Einblick bekommt wie sowas aussieht und was es macht.

von Martin S. (strubi)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #5887104:
> Die pipeline Stufen ergeben sich aus den Anforderungen der Synthese und
> der Fähigkeiten des FPGAs. Die müssen nicht geändert werden, sondern
> können von der Synthese automatisch verteilt werden, wenn man es richtig
> formuliert.

Ich glaube er meint die Arithmetik/Verarbeitungs-Pipeline, nicht simples 
Register-Pipelining, was die Synthese optimieren kann. Die muss man 
durchaus in VHDL von Hand stricken.

Weltbester FPGA-Pongo schrieb im Beitrag #5887104:
> Ich erbitte ein Bespiel für einen C-Code, der kürzer ist, als das
> gleichwertige Pendant in VHDL.

Naja, was erwartest du? Man kann eine Rechenformel linear einfach so 
hinschreiben. Allerdings bietet C nicht die Möglichkeiten, sich das 
einfach zu definieren, die Frameworks sind gehörig komplex, um daraus 
HDL zu erzeugen und selten transparent. In C++ geht's schon besser, aber 
IMHO ist es mit Python am besten zu handhaben. Beispiel:
1
  @hls(context)
2
  def calc(idata, coef, odata):
3
    r0 = idata[0]
4
    r1 = idata[7]
5
6
    r2 = r0 + r1
7
    r4 = r2 * coef[0]
8
9
    r3 = r0 - r1
10
    r5 = r3 * coef[1]
11
12
    odata[4] = r4
13
    odata[0] = r5

In MyHDL-Ausgabe:
1
..
2
    @always(clk.posedge)
3
    def s1_proc():
4
        r0.next = idata[0]
5
        r1.next = idata[7]
6
7
    @always(clk.posedge)
8
    def s2_proc():
9
        r2.next = r0 + r1
10
..

Die Arithmetik, Rundungsdetails und Umwandlung in korrektes HDL macht 
das dahinterliegende MyHDL-Framework.
Ich möchte den Xilinx-Ansatz nicht dissen, aber sehe ihn eher als wenig 
produktiv für komplexe DSP-Pipelines, mal vom "vendor lock-in" 
abgesehen.

Hußnätter schrieb:
> Gibt es Firmen, die das nutzen und damit Geld verdienen?
> Oder sind alle ernsthaften Projekte immernoch in einer normalen HDL
> erstellt?

Ich würde fast sagen, dass es kaum noch Sinn macht, komplexe 
'ernsthafte' Designs die konfigurierbar sein müssen (wie CPU SoCs, etc), 
noch in bare-metal HDL zu machen. Immer mit Ausnahmen, natürlich.
Auch wenn jetzt Ansätze wie chisel eher als Murks einzustufen sind: 
RISC-V ist auch ein ernsthaftes Projekt...oder?

von daniel__m (Gast)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #5887104:
> Ich erbitte ein Bespiel für einen C-Code, der kürzer ist, als das
> gleichwertige Pendant in VHDL.

hi, in etwa so

int distance(int a, int b) {
  return sqrt(a*a+b*b);
}

?

HLS hat seine Einschränkungen. Da gibt es keine Diskussion, auch die 
Resourceneffizienz ist schlechter als bei HDL. Es verhält sich 
vermutlich wie Assembler zu C/C++. Der große Gewinn ist die gesparte 
Zeit (nach der grundlegenden Einarbeitung). Ich setzte HLS gerne für 
reines numbercrunching ein, wo ich mich auf den Algo konzentriere und 
der Kontrollpfad von HLS automatisch erzeugt wird. Per Hand möchte ich 
komplexe Berechnungen nicht (mehr) manuell ausbalanzieren, ggf. mit 
Hand-Shaking-Signalen hantieren und Core/Primitive Latenzen kennen. 
Inzwischen wird auch immer öfter Floating Point Artihmetik (zumindest 
punktuell) eingesetzt, das macht es nicht einfacher.

Definitiv ist HLS keine Lösung für jedes Problem, aber es ist ein 
Blick wert.

Grüße

von FPGA zum Spass (Gast)


Lesenswert?

Die VHDL implementierung davon ist gleichlang....

Beschreib bitte noch was du dir davon erwartest:
- Latenz
- Ressourcenverbrauch
- ...

Das Problem ist doch eher was daraus gebaut wird. WENN HLS da effizient 
wäre und z.b. automatisch Pipelining oder was auch immer macht, dann 
wäre das ja ok.
Nur weiß HLS eben nicht was ich als Entwickler daraus machen will und 
DAFÜR braucht man dann wieder VHDL.

Das sind eben die Probleme wenn man etwas synthetisieren will.

Du wirst ja wohl kaum diese Rechnung da oben in einem Takt haben wollen.

von Klakx (Gast)


Lesenswert?

FPGA zum Spass schrieb im Beitrag #5888347:
> Das Problem ist doch eher was daraus gebaut wird. WENN HLS da effizient
> wäre und z.b. automatisch Pipelining oder was auch immer macht, dann
> wäre das ja ok.

Das ist es ja der Witz dabei. Über Pragmas und Constraints gibst du das 
Designziel vor. Z.b. Anzahl der Takte.

von daniel__m (Gast)


Lesenswert?

FPGA zum Spass schrieb im Beitrag #5888347:
> - Latenz
> - Ressourcenverbrauch

Das hängt massiv von deinen weiteren Designvorgaben ab. Klassisch wird 
die Taktfrequenz als erste Vorgabe benötigt. Diese sagt dem HLS, wieviel 
Kombinatorik es zwischen zwei Registern packen darf (daher ist die 
Kenntnis des FPGA-Typs relevant). Als nächste Angabe wird oft der II 
angegeben: alle wieviele Takte soll ein neuer Wert verarbeitet werden, 
z.B II=1: jeder Takt neue Daten. Daraus resultiert dann die Latenz und 
der Resourcenverbrauch (ähnlich dem ohmschen Gesetz). Latenz und 
Resourcenverbrauch werden dann üblicherweise auf Akzeptanz bewertet 
(manuell vom Entwickler per Report), und wenn nicht, müssen die Vorgaben 
überdacht werden: z.B. höherer Takt, dafür nur II=2, was 
Resourcensharing ermöglicht bei ca. gleicher Latenz.

Ich glaube, ich werde mal myHDL anschauen, bin aber skeptisch, wie 
effizient die Resourcen sind. Ich kann mir aktuell nicht vorstellen, 
dass ohne Kenntnisse des FPGA-Typs eine effiziente Beschreibung 
herauskommt.

grüße

von Vancouver (Gast)


Lesenswert?

daniel__m schrieb:
> Ich glaube, ich werde mal myHDL anschauen

MyHDL ist eine tolle Sache, aber man sollte sich vor Augen halten, dass 
man damit keinen "FPGA in Python programmiert". Eine MyHDL-Bescheibung 
sieht genauso aus wie eine VHDL- oder Verilog-Beschreibung (eben ein 
RTL-Design, kein Algorithmus), aber mit den Sprachelementen von Python. 
Ohne eine Vorstellung, wie das beschriebene Design nach der Synthese 
aussehen würde, kommt man mit MyHDL nicht ans Ziel, selbst wenn man 
Python beherrscht.

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Ich benutze regelmäßig Vivado HLS, um Berechnungen zu implementieren.

Der große Vorteil bei C/C++ ist, dass es eine natürliche Sequenz hat. 
Diese muss man in VHDL mit einer FSM nachbilden. Das nimmt einem das 
HLS-Tool ab.

Auch wenn Vivado von Xilinx ist, kann man damit Code für Altera/Intel, 
Lattice und Microsemi generieren. Man muss die Einstellungen nur so 
machen, dass keine Xilinx spezifischen Komponenten instanziert werden.


Hier ist der C++ Code für einen Interpolator.
1
#include "ap_int.h"
2
3
ap_uint<12> sld_ntc_interpol (ap_uint<12> i_voltage) {
4
5
  ap_uint<12> s_rem;
6
  ap_uint<12> s_idx;
7
  ap_uint<12> s_slope;
8
  ap_uint<12+12> s_diff_full;
9
  ap_uint<12> s_diff;
10
  ap_uint<12> s_temp;
11
  ap_uint<12> s_temp_tbl[]=
12
      {1 * 2, // 0 V
13
       1 * 2,   // 0.625
14
       1 * 2, // 1.25
15
       1 * 2, // 1.875
16
       1 * 2, // 2.5
17
       20.558 * 2, // 3.125
18
       36.768 * 2, // 3.75
19
       47.108 * 2, // 4.375
20
       (328-273) * 2}; // 5 
21
22
  s_rem = i_voltage % (1<< 9);
23
  s_idx = i_voltage / (1<< 9);
24
  s_slope = s_temp_tbl[s_idx+1] - s_temp_tbl[s_idx];
25
  s_diff_full = (s_slope * s_rem);
26
  s_diff = (s_diff_full + (1<< 8)) / (1<< 9);
27
  s_temp = s_diff + s_temp_tbl[s_idx];
28
    return s_temp;
29
}

Das ist ein NTC-Interpolator, um eine Spannung in eine Temperatur 
umzurechnen. Also nichts was besonders schnell ist. So sieht die Entity 
aus:
1
entity sld_ntc_interpol is
2
port (
3
    ap_clk : IN STD_LOGIC;
4
    ap_rst : IN STD_LOGIC;
5
    ap_start : IN STD_LOGIC;
6
    ap_done : OUT STD_LOGIC;
7
    ap_idle : OUT STD_LOGIC;
8
    i_voltage_V : IN STD_LOGIC_VECTOR (11 downto 0);
9
    ap_return : OUT STD_LOGIC_VECTOR (11 downto 0) );
10
end;

Man legt i_voltage_v an, aktiviert ap_start. Nach ein paar Takten liegt 
das Ergebnis an ap_return an und ap_done wird aktiviert. Das ist nur ein 
einfaches Beispiel, es gehen auch komplexere Sachen.

Tom

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Vancouver schrieb:
> MyHDL ist eine tolle Sache, aber man sollte sich vor Augen halten, dass
> man damit keinen "FPGA in Python programmiert". Eine MyHDL-Bescheibung
> sieht genauso aus wie eine VHDL- oder Verilog-Beschreibung (eben ein
> RTL-Design, kein Algorithmus), aber mit den Sprachelementen von Python.

Eigentlich ist MyHDL auf einer Meta-HDL-Ebene angesiedelt, d.h. man 
beschreibt in Python, wie eine HDL-Beschreibung erzeugt werden soll. Wie 
schon von Vancouver völlig richtig erkannt, ist das keine algorithmische 
Besschreibung z.B. von Signalverarbeitungs- oder Rechenfunktionen.

von Martin S. (strubi)


Lesenswert?

Andreas S. schrieb:
> Eigentlich ist MyHDL auf einer Meta-HDL-Ebene angesiedelt, d.h. man
> beschreibt in Python, wie eine HDL-Beschreibung erzeugt werden soll. Wie
> schon von Vancouver völlig richtig erkannt, ist das keine algorithmische
> Besschreibung z.B. von Signalverarbeitungs- oder Rechenfunktionen.

Ich schrob auch generisch oben "Python". MyHDL generiert nicht die 
Pipeline aus der Formel. Die Generatoren für solche HLS-Sachen muss man 
sich selber stricken, also auf jeden Fall für seine spezifischen 
DSP-Elemente die Arbeit reinstecken. Aus derselben Formel will man z.B. 
Vektor(SIMD)-Befehle ausspucken, oder HW generieren.

Ansonsten sollte natürlich klar sein, dass die MyHDL-Erweiterung Python 
'nur' zu einer HDL im Sinn von VHDL und Verilog macht. Also: nach wie 
vor wird auf dem Layer in getakteten Prozessen und Kombinatorik gedacht, 
zu Verilog/VHDL schenkt sich nur, dass das Datentypen-Handling deutlich 
flexibler ist, neben einiger anderer cleverer Schmankerl, wie 
Wiederverwertung und die beliebte Reset-Thematik (ASIC vs. FPGA).

von J. S. (engineer) Benutzerseite


Lesenswert?

> Die pipeline Stufen ergeben sich aus den Anforderungen der Synthese und
> der Fähigkeiten des FPGAs.
Es gibt Fälle, wo diese Einteilung benötigt wird, wenn eine bestimmte 
Rhythmizität der pipe benötigt wird, weil sie mehr, als eine Dimension 
hat oder eine dedizierte Länge braucht, die mit anderen Zweigen 
zusammenpasst, wie bei Iterationen oder emulierten Rekursionen.

Die genaue Definition ist dann aber in HLS oder auch Simulink nicht 
wirklich einfacher. Macht man das design nicht im Kopf, sondern z.B. mit 
Excel, dann hat man eigentlich das Instrument an der Hand, um die FF 
automatisch setzen zu lassen und auch passend zu verändern. Das geht 
allemal schneller, als es manuell über die Eingabe beim tool zu machen.

> Die können von der Synthese automatisch verteilt werden,
> wenn man es richtig formuliert.
Sie können auch dann verteilt werden, wenn man es gar nicht formuliert 
:-)
Man lässt die FF einfach weg:-)

Aber wie gesagt: Eine Änderung, die einer o.g. Qualität bedarf, kann 
auch nicht beliebig eingestellt werden.

 Wenn schön bräuchte es eine übergeordnete Sprache, mit der solche 
pipelines definiert und gestaltet werden können.

Davon ist HLS aber noch sehr weit weg.

von daniel__m (Gast)


Lesenswert?

Jürgen S. schrieb:
> Das geht
> allemal schneller, als es manuell über die Eingabe beim tool zu machen.

Hmm, könnte sein. Wie gesagt, HLS ist nicht für jedes Problem gleich gut 
geeignet (Hammer <> Nagel).

Jürgen S. schrieb:
> Es gibt Fälle, wo diese Einteilung benötigt wird, wenn eine bestimmte
> Rhythmizität der pipe benötigt wird, weil sie mehr, als eine Dimension
> hat oder eine dedizierte Länge braucht, die mit anderen Zweigen
> zusammenpasst, wie bei Iterationen oder emulierten Rekursionen.

Klingt mir ganz nach dem Latency-Pragma. Das habe ich auch schon 
eingesetzt, um eine HLS-Implementierung mit einem anderen Pfad zu 
synchronisieren.

Vancouver schrieb:
> Eine MyHDL-Bescheibung
> sieht genauso aus wie eine VHDL- oder Verilog-Beschreibung (eben ein
> RTL-Design, kein Algorithmus).

Dann ist MyHDL wohl doch nichts für mich, wenn ich in RTL denken muss, 
da möchte ich lieber bei VHDL bleiben. Das ist ja gerade das schöne an 
HLS, dass ich vordergründig nur den Algo betrachten muss und er verteilt 
die Schritte auf die Pipelinestufen (inkl. ready/valid hand-shaking, 
wenn gewünscht). Gut, die Simulation in MyHDL wird deutlich schneller 
sein, jedoch muss ich nach der Transformation in VHDL diese auch testen.

PS: das bietet HLS auch: Simulation der Algorithmik in C mit hoher 
Geschwindigkeit, Kontrolle der HDL (mit flow-control, etc) durch 
"Co-Simulation".

grüße

von J. S. (engineer) Benutzerseite


Lesenswert?

Ich sehe einen Vorteil darin, eventuelle Algos auf C-basierten 
Plattformen zu testen. Ansonsten kann man in VHDL das pipeline delay 
Thema ja auch entkoppeln. Wenn ich nicht mit Excel arbeite, was die 
delays und Bezeichnungen automatisch vergibt und den Code baut, dann 
schreibe ich es in VHDL ohne delays / FF hin und habe ebenfalls direkt 
simulationsfähigen Code, der richtig arbeitet.

In den meisten Fällen, in denen die exakte Delaytiefe iirellevant ist, 
kann man dann auch n FF-Stufen dahintersetzen und es von der Synthes 
reinbalcieren lassen.

von S. R. (svenska)


Lesenswert?

daniel__m schrieb:
>> Eine MyHDL-Bescheibung sieht genauso aus wie eine VHDL- oder
>> Verilog-Beschreibung (eben ein RTL-Design, kein Algorithmus).
>
> Dann ist MyHDL wohl doch nichts für mich, wenn ich in RTL denken muss,
> da möchte ich lieber bei VHDL bleiben.

Der Hauptvorteil von MyHDL ist nicht, dass die Hardware für die Synthese 
schöner beschrieben werden kann, sondern dass man in der Simulation 
vollen Zugriff auf sämtliche Python-Bibliotheken hat.

Aber ich glaube, der wichtigste Punkt wurde am Anfang gesagt:

Weltbester FPGA-Pongo schrieb im Beitrag #5886721:
> Wenn das Verständnis für die Abläufe und Notwendigkeiten der Struktur
> aber vorliegt, ist die Lösung ausgewählt, ohne mit viel Aufwand das tool
> in diese Ecke zu bewegen. Das Formulieren in VHDL ist ein Klacks.

Wenn ich die Lösung bereits habe, ist das Hinschreiben kein Problem.

Aber das, was akademisch unter "design space exploration" läuft, also 
einfach mal verschiedene Ansätze ausprobieren, deren Vor- und Nachteile 
gegeneinander abzuwägen und dann für die jeweilige Anwendung 
auszuwählen, ist sehr aufwändig.

Damit wären wir bei der Assembler-Diskussion angekommen: Ein fertiger 
Algorithmus lässt sich einfach in Assembler runterschreiben und wird 
dann auch funktionieren. Aber der Aufwand, mal schnell (global) "-O3" 
gegen ein "-Os" abzuwägen, ist enorm.

von Kinderkacke Entsorger (Gast)


Lesenswert?

S. R. schrieb:
> Der Hauptvorteil von MyHDL ist nicht, dass die Hardware für die Synthese
> schöner beschrieben werden kann, sondern dass man in der Simulation
> vollen Zugriff auf sämtliche Python-Bibliotheken hat.

Ja und damit würde sich MyHDL wunderbar für Einsteiger eignen, falls 
sich die Einsteiger ausgiebig mit der Simulation befassen würden, statt 
gleich den FPGA zu konfigurieren.
Aber so glotzen sie nur blöde, weil die Hardware nix tut und sie keine 
Ahnung haben welche Schaltvorgänge nun konkret ausgeführt werden. Falls 
sie überhaupt wissen, wass Schaltvorgänge sind, weil die ja nicht im 
C-Syntax ersichtlich sind.

von S. R. (svenska)


Lesenswert?

Kinderkacke Entsorger schrieb:
> Ja und damit würde sich MyHDL wunderbar für Einsteiger eignen,
> falls sich die Einsteiger ausgiebig mit der Simulation befassen
> würden, statt gleich den FPGA zu konfigurieren.

Wenn ich nur simulieren wollte, könnte ich auch programmieren. Letzteres 
ist einfacher. Als Einsteiger fasse ich Hardware hauptsächlich an, um 
was zu sehen (blinkende LEDs, Siebensegmentanzeigen, ...).

Kinderkacke Entsorger schrieb:
> Falls sie überhaupt wissen, wass Schaltvorgänge sind,
> weil die ja nicht im C-Syntax ersichtlich sind.

Vollkommen überraschend ist C-Syntax in MyHDL kein Thema.

von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Kinderkacke Entsorger schrieb:
> Ja und damit würde sich MyHDL wunderbar für Einsteiger eignen, falls
> sich die Einsteiger ausgiebig mit der Simulation befassen würden, statt
> gleich den FPGA zu konfigurieren.

Viele Einsteiger haben aber große Verständnisprobleme damit, dass sie 
auf der Hardware eben nur einen Bruchteil der Betriebsmittel wie in der 
Simulation möglich zur Verfügung haben. Es gab doch erst kürzlich hier 
einen Thread zur VGA-Ausgabe eines in einer Datei gespeicherten Bildes. 
Oder auch vor längerer Zeit die Frage, wie man denn nun einen 
TCP/IP-Socket auf dem instantiierten Ethernet-IP-Block öffne, usw..

> Aber so glotzen sie nur blöde, weil die Hardware nix tut und sie keine
> Ahnung haben welche Schaltvorgänge nun konkret ausgeführt werden. Falls
> sie überhaupt wissen, wass Schaltvorgänge sind, weil die ja nicht im
> C-Syntax ersichtlich sind.

Aus genau diesen Gründen halte ich es für wichtig, sehr frühzeitig 
(=sofort) auch(!) mit realer Hardware zu arbeiten, damit sich die 
Softwaresicht nicht zu stark festigt.

von Weltbester FPGA-Pongo (Gast)


Lesenswert?

S. R. schrieb:
> Damit wären wir bei der Assembler-Diskussion angekommen:
Das kann man aber nicht vergleichen. C-Ablauf und ASM-Lauf sind ähnlich.

VHDL <-> C ist schon deutlich anders und deckt andere Dinge ab.

Mir ging es daraum aufzuzeigen, dass durch die Verwendung von C, das 
Finden eines Konzeptes nicht wirklich vereinfacht wird. Ich habe im 
Gegenteil den Eindruck, dass diejenigen, die aus der C-Ecke kommen, so 
Ablauf-orientierten Lösungen greifen, und FPGA-spezifische Dinge 
garnicht sehen und Kennenlernen.

Dann bleibt es nur bei dem Vorteil einer vereinfachten Beschreibung, 
innerhalb des scheinbar richtigen Konzeptes.

Ich schreibe das, was ich seit 20 Jahren FPGA-Lösungen sehe und die 
Versuche vor Augen habe, die mit C-ähnlichen Ansätzen produziert wurden 
und werden.

Die Lösungen werden eher schlechter. In einem aktuellen Fall, wurde in 
einem Projekt alles erdenkliche in C formuliert und verinfacht dann auch 
gleich ins SoC gestopft. Die Hälfte der Moduln hätte in gänzlich anderer 
Form ins FPGA gehört. Dann hätte hätte man keinen fetten "Ultraslave" 
gebraucht und wäre mit einem Drittel der FPGA-Kosten davon gewesen. Was 
bei der Stückzahl eine fette Summe ausmacht und jeden Mehraufwand an 
VHDL-Entwicklung rechtfertigt hätte.

Und:

Ich habe den Eindruck, dass Entscheider aufgrund der Existenz solcher 
Systeme, mehr und mehr dazu neigen, FPGA-Themen zu unterschätzen. Noch 
mehr, als sie es jetzt schon tun. Da werden dann C-Entwickler 
beauftragt, die nie eine HW gemacht haben.

von S. R. (svenska)


Lesenswert?

Weltbester FPGA-Pongo schrieb im Beitrag #5892068:
>> Damit wären wir bei der Assembler-Diskussion angekommen:
> Das kann man aber nicht vergleichen.
> C-Ablauf und ASM-Lauf sind ähnlich.

Sicher, beides ist "Software programmieren".

> VHDL <-> C ist schon deutlich anders und deckt andere Dinge ab.

Ich sehe VHDL/Verilog (also die RTL-Sicht) auf der gleichen Ebene wie 
Assembler, nicht wie C. Natürlich nebeneinander, weil Hardware und 
Software nicht das gleiche sind.

> Die Lösungen werden eher schlechter.

Schau dir Softwareentwicklung an und die siehst den gleichen Trend und 
auch die Gründe dafür. Ist so, nimm es hin.

> Da werden dann C-Entwickler beauftragt, die nie eine HW gemacht haben.

Wieviele C-Entwickler gibt es, wieviele VHDL-Entwickler?
Welcher Anteil davon ist kompetent?

Kostenfrage. In unseren Breiten ist der Entwickler der Kostenfaktor, 
nicht der FPGA. Solange die verkürzte Entwicklungszeit (inkl. 
time-to-market) die höheren Produktkosten rechtfertigt, lohnt sich das. 
Und solange hinten noch Gewinn rausfällt, passt alles.

von Gatterloge (Gast)


Lesenswert?

S. R. schrieb:
>> Da werden dann C-Entwickler beauftragt, die nie eine HW gemacht haben.
>
> Wieviele C-Entwickler gibt es, wieviele VHDL-Entwickler?
> Welcher Anteil davon ist kompetent?

Meine Schätzung:

Anzahl C-Programmierer : FPGA-Entwickler:  1: 100 ... 1000

Kompetenz C-Programmierung bei FPGA_Entwickler: 50%
Kompetenz FPGA-Entwicklung bei C-Programmierer:  0.1 ‰

Schulungsaufwand FPGA-Entwickler zu C_Programmierer : Gering bis mittel
Schulungsaufwand C_Programmierer zu FPGA-Entwickler : mittel bis sehr 
hoch

von Bastian (Gast)


Lesenswert?

Gatterloge schrieb:
> Anzahl C-Programmierer : FPGA-Entwickler:  1: 100 ... 1000

Du meinst es sicher anders herum, nehme ich an.

Egal, ich denke, du unterschätzt die Zahl der FPGA-Kenner. Ich würde es 
10:1 sehen. Aber 99% auf beiden Seiten sind Anfänger, die kaum mehr 
können, als Schleifen und Funktionsaufrufe, bzw Komponentenverdrahtung.

von Elbi (Gast)


Lesenswert?

Wir haben seit einigen Jahren eine wachsende Entwicklungsabteilung, die 
sich mit dem rapid design befasst. Alles, was an Produkten released 
wird, wird auf Eval-Plattformen geprototyped und so beschleunigt.

Wir arbeiten zu 80% mit Vivado, der Rest ist Lattice. Altera wurde aus 
verschiedenen Gründen aus der Abteilung entfernt, was ich schade fand, 
weil ich privat nur mit Altera baue.

Xilinx kommt besonders bei den Hochgeschwindigkeitsanwendungen und 
Interface-lastigen designs in Spiel, daher läuft gefühlt 90% der 
schwierigen Dinge in Vivado. Für die Innereien haben wir daher auch 
überwiegend Xilinx-Cores im Gebrauch. Aus Kompatibiltätsgründen wird 
jeder Pfurz mit einem Axi-wrapper versehen und die Daten zwischen RPU 
und PL hin und hergewürfelt.

Seit etwa 1 Jahr ist auch verstärkt HLS im Gebrauch. Geht super schnell 
für Anwendungen, die sich in C einfach formulieren lassen. Das sind 
gefühlt 30% der Innereien. Weitere 40% gehen so einigermassen flott und 
werden auch nicht größer.

Zu 70% ist das recht brauchbar würde ich sagen. Das einzige, was bei den 
Lösungen auftritt, ist eventuell mehr Einlesebedarf und Verständnis für 
die Xilinx-typischen Vorgehens- und Denkweisen und ein Mehraufwand im 
Silizim sowie in den Abläufen. Das bedeutet größere Delays, Latenz, 
Laufzeit und vor allem auch mehr Stromverbrauch, als generische 
Lösungen.

Das letzte Drittel der Aufgaben aber wirf enorme Umstände auf! Jede noch 
so kleine Funktion muss verpackt, in IPs gebacken und umständlich 
instanziiert werden. Konfiguration über AXI erfordert gleich einen 
Prozessor und zusätzliche Funktionen im BSP und den root Code.

Wir haben hier aber einige Jungspunde, die vollständig AXI-süchtig sind 
und davon nicht wegkommen. Scheinen sich bei PLC2 angesteckt zu haben. 
Jetzt wird alles AXI-fiziert, was bei 3 nicht auf den Bäumen ist.

Obendrein sind sehr viele in der Abteilung, die von der C-Welt kommen 
und am Liebsten alles auf dem Prozessorsystem laufen lassen würde.

Das Resultat ist an vielen Stellen der 10fache Aufwand, wie es "normal" 
gewesen wäre. Das macht vieles wieder kaputt.

Das größte Problem sehe ich in der Abhängigkeit zu Xilinx. Wenn da 
irgend ein CoreGen oder eine Script nicht läuft oder fehlt, dann geht 
alles in die Hose und man findet den Fehler einfach nicht.

HLS ist ein weiterer Schritt in diese Richtung. Wenn die Funktion stimmt 
und alles zusammenpasst, ist das fein und bequem. Aber wehe, wenn nicht.

von Christophz (Gast)


Lesenswert?

Danke Elbi für diesen Blick aus deiner praktischen Erfahrung.

Mein Problem an dieser ganzen Diskussion zeigt sich schon im Titel: 
"High Level Synthese aus C Code"

Wenn ich Software schreibe will ich seit Jahren schon kein C mehr 
benutzen, bekomme jedes mal Fluchtgedanken wenn ich das machen muss. 
Eigentlich ist hier der Trend ja auch Richtung höherer Abstraktion bzw. 
Sprachen in denen weniger kaputt gemacht werden kann (Rust, D, Ada, 
Matlab code generator, zum teil anwendbar auf C++).

High level synthese ist ein sehr spannendes Thema und die aktiven FPGA 
Entwickler wissen ja (wie auch die Diskussion hier zeigt) dass da viel 
Zeitersparnis denkbar ist, weil oft die Struktur ab einer gewissen 
Planungsstufe klar ist und dann von Hand viel HDL code geschrieben 
werden muss.

Meiner Meinung nach ist C viel zu low-level (ist ja auch zu low-level 
für moderne CPUs...) um als vernünftige Basis zu dienen um all die 
Zukunftsvisionen zu erreichen, die mit HLS verknüpft werden. Einen guten 
Vorschlag habe ich derzeit aber auch nicht.

von Gatterloge (Gast)


Lesenswert?

Christophz schrieb:
> dass da viel
> Zeitersparnis denkbar ist, weil oft die Struktur ab einer gewissen
> Planungsstufe klar ist und dann von Hand viel HDL code geschrieben
> werden muss.

Nein, es muss nicht viel Code mit der Hand geschrieben, weil FPGA's 
durch parallele und kanonische Strukturen charakterisiert sind. Wenn für 
ein OS Millionen LoC's geschaffen werden müßen, reichen für den 
zugrundeliegenden Prozessor einige Zehntausend.

Der Zeitaufwand steckt in der Verifikation, nicht in der Code 
Erstellung.

von Christophz (Gast)


Lesenswert?

Gatterloge schrieb:
> Der Zeitaufwand steckt in der Verifikation, nicht in der Code
> Erstellung.

Sehr richtig, und genau hier verspricht HLS ja auch Möglichkeiten zur 
Zeitersparnis.

Sei es simple, wie schon geschrieben, dass C schneller rennt als ein HDL 
Simulator. Auf höherer Abstraktionsstufe hat man weniger Lines-of-code 
(LoC) und somit ist eine hohe code coverage schneller erreicht in der 
Verifikation. Die Vision ist, das auch zu erreichen/bewahren ohne die 
parametriesierbarkeit/design-space-exploration einzuschränken.

von Christophz (Gast)


Lesenswert?

Christophz schrieb:
> Meiner Meinung nach ist C viel zu low-level (ist ja auch zu low-level
> für moderne CPUs...) um als vernünftige Basis zu dienen um all die
> Zukunftsvisionen zu erreichen, die mit HLS verknüpft werden. Einen guten
> Vorschlag habe ich derzeit aber auch nicht.

Ein Beispiel wie ich zu solchen Aussagen komme und die mir einen 
Vorgeschmack gegeben haben, kam mir gestern wieder in den Sinn:

Die Domain-specific-language FAUST (https://faust.grame.fr/) "Faust 
(Functional Audio Stream) is a functional programming language for sound 
synthesis and audio processing" wird meistens in C++ Code übersetzt aber 
kann auch in C, JAVA, JavaScript, LLVM bit code, WebAssembly übersetzt 
werden.

Schon 2006 kam ein Paper heraus, wo ein proof-of-concept vorgestellt 
wurde, um FAUS in VHDL zu übersetzen 
(https://hal.archives-ouvertes.fr/hal-02158935/document). Sehr 
interessant zu lesen, da sich die Autoren bewusst waren, das z. B. die 
Umsetzung von float nach fixpoint Arithmetik automatisch passieren soll 
aber trotzdem transparent für den Benutzer, so dass bei Bedarf vorgaben 
gemacht werden können.

von Strubi (Gast)


Lesenswert?

Moin,

Christophz schrieb:
> Meiner Meinung nach ist C viel zu low-level (ist ja auch zu low-level
> für moderne CPUs...) um als vernünftige Basis zu dienen um all die
> Zukunftsvisionen zu erreichen, die mit HLS verknüpft werden. Einen guten
> Vorschlag habe ich derzeit aber auch nicht.

C ist ja auch als portable Low-Level-Sprache eine Schicht über'm 
Assemblercode designt, warum nicht auch für moderne CPUs.
Nur taugt sie halt als Beschreibungssprache nicht, und 
#pragma-Verunstaltungen gelten als tool-spezifischer Murks, der in der 
Sprache eigentlich nichts zu suchen hat.

Christophz schrieb:
>> Der Zeitaufwand steckt in der Verifikation, nicht in der Code
>> Erstellung.
>
> Sehr richtig, und genau hier verspricht HLS ja auch Möglichkeiten zur
> Zeitersparnis.

Da bin ich mir eben nicht ganz sicher. Mag sein, dass man mit dem 
C-basierenden HLS-Ansatz von Xilinx in der SDR-Domäne einige Treffer 
landen kann, aber bei Bildverarbeitung sieht's z.B. schon anders aus.

Und besagte Abhängigkeit von Tools/Herstellern ist unter Umständen ein 
veritabler Graus, wenn man das Zeug nach Jahren mal warten muss.

Python deckt da zumindest meine Wunschliste komplett ab, d.h. es geht 
aus einem Guss:
- Volle Kontrolle über Instanzierung der Logik
- Verifikation, Simulation 'eingebaut' (per MyHDL)
- Konversion nach VHDL/Verilog per MyHDL
- Co-Simulation, Geräte-Ansteuerung externer HW

Das lässt sich dann auch nach vielen Jahren wieder aus der 
Revisionskontrolle rausgraben, bzw. laufend per kontinuierliche 
Integration bauen, um auch das Werkzeug gegen die Anwendung zu 
verifizieren.
Solche Mechanismen vermisse ich bei den HLS-Toolchains bisher, bzw. ist 
das mit TCL deutlich frickeliger und bei jedem Tool (Modelsim, Diamond, 
ISE/Vivado) anders.
Für die Zeitersparnis im Gesamtbild muss man auch das Code- und 
Projektmanagement über die Jahre rechnen. Da würde ich das ähnlich wie 
Elbi in seinem Erfahrungsbericht unterschreiben.

Der FAUST-Ansatz klingt auch interessant, ist mir nur noch nicht 
untergekommen. Es ist halt immer schwierig, die Industrie von 
bestehenden Frickellösungen wegzukriegen, und Optimierungen sind auch 
oft gar nicht erwünscht (könnte ja eine Stelle wegfallen).

von Christophz (Gast)


Lesenswert?

Strubi schrieb:
> C ist ja auch als portable Low-Level-Sprache eine Schicht über'm
> Assemblercode designt, warum nicht auch für moderne CPUs.

Mal ein paar Stichworte die mir in den Sinn kommen:
- Einzelnes Bit lesen/testen/schreiben auf Architektur die das als 
Atomic Opcode besitzt. Fühlt sich nicht an wie high-level programmieren 
sondern wie HDL coden nach "Guck ins Handbuch, damit auch wirklich ein 
RAM rauskommt, wenn du ein RAM willst"
- Algorithmen so schreiben, dass der Compiler die Flags von Registern 
optimal nutzen kann (C weiss ja nicht was ein Carry ist)
- Alles was mit Vektorbefehlen zu tun hat (SSE, Neon etc.)
- C geht davon aus, dass eine CPU kein Pipelining hat.
- Und mit Multicore Systemen ist C definitiv überfordert

Ich war erstaunt, dass Fortran unter anderem immer noch eingesetzt wird, 
weil es sich herausgestellt hat, dass es so high-level ist, das älterer 
Fortran Code auf modernen Maschinen recht gut skaliert und moderne CPU 
Features gut nutzen kann (Ich finde den Artikel dazu gerade nicht mehr).

Strubi schrieb:
> Der FAUST-Ansatz klingt auch interessant, ist mir nur noch nicht
> untergekommen. Es ist halt immer schwierig, die Industrie von
> bestehenden Frickellösungen wegzukriegen, und Optimierungen sind auch
> oft gar nicht erwünscht (könnte ja eine Stelle wegfallen).

Wurde nach meinem Wissen nach dem proof-of-concept auch nicht 
weiterentwickelt. Sollte mehr zeigen, wie meine Sichtweise auf HLS ist.

Für die HDL Umsetzung hilft es z. B. dass Faust eine "Data stream 
oriented Language" ist. So wie eben auch Simulink oder Labview. Was eine 
natürliche Betrachtungsweise für DSP Algorithmen ist.

Strubi schrieb:
> Und besagte Abhängigkeit von Tools/Herstellern ist unter Umständen ein
> veritabler Graus, wenn man das Zeug nach Jahren mal warten muss.

Definitiv. Ist aus meiner Sicht der Hauptgrund wieso sich fasst niemand 
getraut etwas anderes als Verilog/VHDL einzusetzen. Ich kenne Firmen die 
aktiv mit Simulink/HDLcoder Produkte Entwickeln, wo auch der 
vendor-lock-in  besteht.

Ach ja, um es auch in den Topf zu werfen, mit SysML (Ein Standard) und 
z. B. Enterprise Architect soll man auch VHDL Code generieren können. 
Kenne da aber auch niemanden aus der Praxis.

Im Vergleich zu Xilinx versucht es Altera/Intel ja mit einer 
Standardisierten Sprache: OpenCL.

Hat das schon jemand in der Praxis gesehen?

von Strubi (Gast)


Lesenswert?

Christophz schrieb:

>
> Mal ein paar Stichworte die mir in den Sinn kommen:
> - Einzelnes Bit lesen/testen/schreiben auf Architektur die das als
> Atomic Opcode besitzt. Fühlt sich nicht an wie high-level programmieren
> sondern wie HDL coden nach "Guck ins Handbuch, damit auch wirklich ein
> RAM rauskommt, wenn du ein RAM willst"

Naja, das hier:
1
r0 |= BIT1 | BIT2;

kann/soll der Compiler aufdröseln. Wenns atomisch nicht geht, muss halt 
ein  CRITICAL_SECTION-Makro her, aber für die HLS wär's ja irrelevant.

> - Algorithmen so schreiben, dass der Compiler die Flags von Registern
> optimal nutzen kann (C weiss ja nicht was ein Carry ist)

Das ist definitiv ein riesen Aergernis, gerade wenn es Richtung 
Fraktionale Datentypen (anstatt Float) geht, da hätte man gerne die 
Modifier aus diversen Assembler-Konstrukten. Oder muss C++-Konstrukte 
bauen, die das tun.

> - Alles was mit Vektorbefehlen zu tun hat (SSE, Neon etc.)
> - C geht davon aus, dass eine CPU kein Pipelining hat.
> - Und mit Multicore Systemen ist C definitiv überfordert
>

Da könnte man jetzt auch argumentieren, dass der C-Compiler das 
erledigen soll, da hat man in GCC auch eine Menge Unterstützung, was die 
RTL angeht.
Das klappt teil auch ganz gut, dass die Pipeline ohne Stalls (mit 
Hardware-Schleifen) durchgenudelt wird. Bei Hybrid-Architekturen wie 
Blackfin (dessen Instruktions-Set auch von Intel stammt) ist die 
Assembly so gut lesbar bzw. C-ähnlich, dass man die Vektor-ALU besser 
gleich manuell programmiert anstatt trial&error in C, und darauf hoffen, 
dass die Optimierung richtig greift.

Mit GCC hätte man ja ansich die Möglichkeiten, wenn die 
RTL/gimple-Geschichte so flott von der Hand ginge, sich seine HLS selber 
zu bauen und Datentypen und Arithmetiken in Abhängigkeiten von gewissen 
Primitiven zu beschreiben. Wenn...


> Ich war erstaunt, dass Fortran unter anderem immer noch eingesetzt wird,
> weil es sich herausgestellt hat, dass es so high-level ist, das älterer
> Fortran Code auf modernen Maschinen recht gut skaliert und moderne CPU
> Features gut nutzen kann (Ich finde den Artikel dazu gerade nicht mehr).
>

Meinst du nicht, dass das auch eher am Compiler liegt? Die numerischen 
Libs sind bei Fortran halt auch state of the art, zumindest war das vor 
20 Jahren so (öhm..)

>
> Ach ja, um es auch in den Topf zu werfen, mit SysML (Ein Standard) und
> z. B. Enterprise Architect soll man auch VHDL Code generieren können.
> Kenne da aber auch niemanden aus der Praxis.
>

Meine Erfahrungen mit grafischen Programmieransätzen a la Labview oder 
Symbolen sind leider, dass das meist zum write-only-Proramming wird und 
die Systeme schnell nicht mehr wartbar werden. Und auch hier das alte 
Ding mit der Revisionskontrolle.

> Im Vergleich zu Xilinx versucht es Altera/Intel ja mit einer
> Standardisierten Sprache: OpenCL.
>
> Hat das schon jemand in der Praxis gesehen?

Ich kenne das nur von den Vektor-GPUs her, also die generischere 
Weiterentwicklung von nvidias CUDA bzw. Shader-Assembly.
Aber was ich nicht weiss: Wie man da die Kontrolle über die HDL, 
Pipelining und benutzte Resourcen erhält, unabhängig von der 
eigentlichen Rechnung. Bisher wurden da einfach mehrere Instanzen 
angelegt und die Daten verteilt.

Im Prinzip will ich für eine gewisse Architektur sowas wie ein 'Style 
sheet', was auch die Resourcen beschreibt. Da möchte man dann die 
Freiheit haben, Pipelining versus parallelle Abarbeitung anzupassen.
Davon getrennt dann das eigentliche HLS-Modul, was die Verarbeitung des 
besagten Stream beschreibt. Das kann ja dann durchaus im Sinne eines 
Programms zu lesen sein, damit man denselben Code in der HW wie auch auf 
einer allenfalls dedizierten CPU verifizieren kann. Derselbe Code kann 
mit anderem Stylesheet dann auf FPGA Y statt X mit 10 Zyklen anstatt 2 
o.ä. die Rechnung abarbeiten.

Mit der universalen "Klebersprache" Python geht das im Ansatz recht gut, 
es fehlt nur irgendwie an Moment, während an den Hochschulen laufend 
neue HDL-Sprachen mit wechselnder Akzeptanz entstehen. Mit unzähligen 
proprietären Frameworks muss man so oder so leben, bei den Sprachen 
denke ich eher: Muss nicht sein.

Die Frage ist halt immer, ob sich das alles rechnet. Wenn man die 
Frameworks an der Hand hat - so wie Intel - designt man sich mal eben 
eine neue Mikrocode-Architektur und die zugehörigen parallelisierenden 
Asm oder gar VLIW-Befehle. Dasselbe dann im FPGA, anstatt die Pipeline 
hart zu codieren.

Fürs Prototyping kann man allerdings allein schon einen Sinn in HLS 
sehen, um schnell eine funktionierende Referenz zu haben. Wenn man gegen 
die im Klartext (VHDL oder Verilog) vorliegende Simulation vergleichen 
kann, spart man auch schon Zeit, auch wenn man alles nochmal neu 
schreibt oder handoptimiert. Nur: Derjenige der das tut, muss die 
Randbedingungen und die Innereien genau kennen, also wiederum: HDL, 
Synthese und PnR auf die Knochen beherrschen.

von Christophz (Gast)


Lesenswert?

Strubi schrieb:
>> Ich war erstaunt, dass Fortran unter anderem immer noch eingesetzt wird,
>> weil es sich herausgestellt hat, dass es so high-level ist, das älterer
>> Fortran Code auf modernen Maschinen recht gut skaliert und moderne CPU
>> Features gut nutzen kann (Ich finde den Artikel dazu gerade nicht mehr).
>>
>
> Meinst du nicht, dass das auch eher am Compiler liegt? Die numerischen
> Libs sind bei Fortran halt auch state of the art, zumindest war das vor
> 20 Jahren so (öhm..)

Ja, genau um das geht es. Unmodifizierter Fortran Code der die 
Standardlibraries benutzt wird jedes Jahr schneller. Weil die Computer 
schneller werden, Compiler besser werden und die Standardlibraries 
state-of-the-art sind. Für Physiker, Mathematiker, Metreologen etc. 
scheint Fortran tatsächlich immer noch high-level genug zu sein. 
(Korrigiert mich, falls jemand genaueres weiss). Das ist das, was eine 
high-level-sprache an Effizienzgewinn verspricht.

Bei nicht-mehr-genug-high-level Sprachen wie C (Meine Stichworte hast du 
genutzt um gut zu Zeigen, wie Aufwändig es mit C ist diese zu 
beherrschen) darf man alle paar Jahre den Code anfassen um z. B. OpenMP 
pragmas nachzurüsten, array Längen etc. an Cacheline Grössen ausrichten 
oder Libraries mit neuen state-of-the-art Libraries ersetzen (Weil C 
kaum Standartlibraries hat, dies gilt mal wieder nicht für C++).

Strubi schrieb:
> Im Prinzip will ich für eine gewisse Architektur sowas wie ein 'Style
> sheet', was auch die Resourcen beschreibt.

Die Idee gefällt mir. Algorithmusdefinition von 
Implementierungsdefinition trennen.

von Markus F. (mfro)


Lesenswert?

Christophz schrieb:
> Ja, genau um das geht es. Unmodifizierter Fortran Code der die
> Standardlibraries benutzt wird jedes Jahr schneller. Weil die Computer
> schneller werden, Compiler besser werden und die Standardlibraries
> state-of-the-art sind.

Der eigentliche Grund für die (unbezweifelte) Überlegenheit von (vielen) 
Fortran-Programmen bzw. -Libraries in Sachen Performance ist m.E. die 
Limitierung auf Call-By-Reference.

Grob vergleichbar zu einem C-Programm, das alle Variablen in einem 
einzigen, globalen Array hält und nur Indizes hin- und herschiebt (man 
kann also auch in C "Fortran programmieren" - bloß den Code nicht mehr 
lesen).

Das erspart eine Menge Stack-Rumgehopse und erlaubt dem Compiler 
deutlich besser zu optimieren.

Hier: 
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.85.9974&rep=rep1&type=pdf 
habe ich eine hübsche Aussage dazu gefunden:

"Why  Fortran  uses  call-by-reference  may  have  more  to  do  with 
the  history  of  the  implementation  than  aesthetics.   In 
retrospect, language designers might view Fortran’s machine memory model 
as a defect, but this appears to be irrelevant to most Fortran 
programmers."

: Bearbeitet durch User
von Andreas S. (Firma: Schweigstill IT) (schweigstill) Benutzerseite


Lesenswert?

Christophz schrieb:
> Für Physiker, Mathematiker, Metreologen etc.
> scheint Fortran tatsächlich immer noch high-level genug zu sein.

Die Programmiersprache hat nichts mit dem Hochschulabschluss der Akteure 
zu tun, sondern mit dem jeweiligen Einsatzgebiet. Nicht jede der 
genannten Berufsgruppen beschäftigt sich ausschließlich mit 
rechenintensiven Simulationen, sondern diese stellen nur einen winzigen 
Teil dar.

Für Allerweltsaufgaben verwenden die meisten Mitglieder der genannten 
Berufsgruppen auch die für den jeweiligen Einsatzzweck geeigneten 
Programmiersprachen. Ich (Physiker) habe zuletzt Anfang der 1990 Jahre 
FORTRAN verwendet, d.h. als Hiwi einige Programme von PDP10/TOPS auf 
VAX/VMS übertragen. In den letzten Jahren verwende(te) ich C, C++, 
Python, TCL, SCL, (VHDL), (GNU Make), bash, BAT/CMD, kein FORTRAN.

von Strubi (Gast)


Lesenswert?

Christophz schrieb:
> state-of-the-art sind. Für Physiker, Mathematiker, Metreologen etc.
> scheint Fortran tatsächlich immer noch high-level genug zu sein.
> (Korrigiert mich, falls jemand genaueres weiss). Das ist das, was eine
> high-level-sprache an Effizienzgewinn verspricht.

Ich habe kurz vor Fortran90 eigentlich das Handtuch geschmissen, u.a. 
wegen der mühseligen Pointerthematik. Da gab's auch Fälle, wo Fortran 
dann deutlich langsamer war als C (wie 2D-FFT).
Hatte auch den Eindruck, dass Fortran nur aufm Grossrechner wirklich 
effizienten Code produziert hat, gfortran/g77 war damals nicht wirklich 
brauchbar.
Aber man sollte auch gnädig sein: Obige Forschergattung möchte zu gutem 
Recht nicht in die Details trickreicher Programmierung einsteigen und 
sehr oft einfach nur brute force rechnen. Die NAG-Lib gibt's offenbar 
immer noch, ob auch für GPU, entzieht sich mir.

Markus F. schrieb:
> Das erspart eine Menge Stack-Rumgehopse und erlaubt dem Compiler
> deutlich besser zu optimieren.

Ich bin mir nicht sicher, ob das heutzutage noch wirklich gilt. 
Zyklenteuer ist eh meist nur die innere (2D-) Schleife. Und diejenigen, 
die ihre Algorithmen optimieren wollen (ohne Library), hacken selbige 
gleich in asm()-Konstrukte.

Um zur HLS zurückzukommen: Ich sehe nicht, was Fortran grundsätzlich 
gegenüber C besser könnte, ausser dass man allenfalls mit der genannten 
CBR-Architektur aus dem Compiler leichter die benötigten Resourcen für 
die Synthese ausspucken kann, da statisch angelegt. Und Fortran77 ist 
schon mal generell (ggü. C) sprachlich so eingeschränkt, dass man 
weniger Gefahr läuft, synthese-inkompatible Konstrukte zu erzeugen.
Stecke aber nicht tief genug drin und kenne die aktuelle Entwicklung 
bzgl. gfortran nicht, alles andere ist für unsereiner auch zu 
hochpreisig.

von Christophz (Gast)


Lesenswert?

Strubi schrieb:
> Um zur HLS zurückzukommen: Ich sehe nicht, was Fortran grundsätzlich
> gegenüber C besser könnte, ausser dass man allenfalls mit der genannten
> CBR-Architektur aus dem Compiler leichter die benötigten Resourcen für
> die Synthese ausspucken kann, da statisch angelegt. Und Fortran77 ist
> schon mal generell (ggü. C) sprachlich so eingeschränkt, dass man
> weniger Gefahr läuft, synthese-inkompatible Konstrukte zu erzeugen.

Mein Abschweifen zu Fortran war auch nicht als Vorschlag gedacht es als 
HLS Sprache zu nutzen. Mehr nochmals als Ergänzung, dass eben das 
Sprachparadigma High-Level sein soll um erfolgreich zu sein (was ich 
eben bei C nicht sehe).

Christophz schrieb:
> Strubi schrieb:
>> Im Prinzip will ich für eine gewisse Architektur sowas wie ein 'Style
>> sheet', was auch die Resourcen beschreibt.
>
> Die Idee gefällt mir. Algorithmusdefinition von
> Implementierungsdefinition trennen.

Eine Ergänzung hierzu:
Der Flow von Simulink bringt das einigermassen hin. In Simulink wird die 
Funktion definiert (Zwingend in Integerarithmetik beschrieben, wenn 
Integer im Ziel genutzt werden soll). Implementationsdetails wie 
Zielfrequenz, Anzahl Zyklen pro Resultat etc. werden unabhängig davon in 
diversen GUI Kontextmenues eingestellt (Halt nicht das, was wir hier als 
Style sheet gerne hätten).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.