Wie sind Computer schneller geworden, wenn sich die Geschwindigkeit der elektrischen Ladung nicht geändert hat?


48

Jeder weiß, dass die Rechengeschwindigkeit seit ihrer Erfindung drastisch zugenommen hat, und sie wird voraussichtlich fortgesetzt. Aber eines ist mir ein Rätsel: Wenn Sie heute einen elektrischen Strom durch ein Material fließen lassen, würde er sich mit der gleichen Geschwindigkeit fortbewegen, als ob Sie es vor 50 Jahren mit demselben Material getan hätten.

In diesem Sinne, wie ist es Computer schneller geworden? Welcher Hauptbereich des Prozessordesigns hat zu diesen unglaublichen Geschwindigkeitssteigerungen geführt?

Ich dachte, es könnte eine oder mehrere der folgenden sein:

  • Kleinere Prozessoren (weniger Entfernung für den Strom, aber es scheint mir, dass Sie hier nur marginale Gewinne erzielen können).
  • Bessere Materialien

4
Das ist eine schöne Frage. Natürlich ist das Material selbst nicht so wichtig - in den letzten 100 Jahren sind Autos schneller geworden, aber das Gas ist immer noch dasselbe (mehr oder weniger), nur der Motor wurde effizienter. Eine erste Antwort finden Sie hier , aber ich hoffe, dass eine genauere Antwort folgt.
Ran G.

Größe ist hier ein großes Thema. Aber afaik haben wir eine physikalische Barriere im Chipdesign erreicht (oder sind nahe dran). (Ich bin hier kein Experte, andere werden mehr darüber wissen). Natürlich ist die Prozessorgröße nicht der einzige Parameter.
A.Schulz,

Die Taktfrequenz der CPU ist durch die Geschwindigkeit der Elektronen in den verwendeten Materialien begrenzt, wurde jedoch von anderen Faktoren dominiert.
Raphael

Weil sie anfangs nicht optimal schnell waren und es immer noch nicht sind. Lichtgeschwindigkeit ist nicht der geschwindigkeitsbestimmende Schritt.
user207421

Antworten:


54

Wenn Sie heute einen elektrischen Strom durch ein Material fließen lassen, würde sich dieser mit der gleichen Geschwindigkeit fortbewegen, wie wenn Sie es vor 50 Jahren mit demselben Material getan hätten.

In diesem Sinne, wie ist es Computer schneller geworden? Welcher Hauptbereich des Prozessordesigns hat zu diesen unglaublichen Geschwindigkeitssteigerungen geführt?

Sie erhalten falsche Schlussfolgerungen, weil Ihre anfängliche Hypothese falsch ist: Sie denken, dass die CPU-Geschwindigkeit der Geschwindigkeit der Elektronen in der CPU entspricht.

Tatsächlich ist die CPU eine synchrone digitale Logik. Die Grenze für seine Geschwindigkeit ist, dass die Ausgabe einer logischen Gleichung innerhalb einer Taktperiode stabil sein soll. Bei der mit Transistoren implementierten Logik hängt die Grenze hauptsächlich von der Zeit ab, die erforderlich ist, um die Transistoren zum Schalten zu bringen. Durch die Reduzierung der Kanalgröße können sie schneller umgeschaltet werden. Dies ist der Hauptgrund für die Verbesserung der maximalen CPU-Frequenz seit 50 Jahren. Heute haben wir auch die Form der Transistoren ändern ihre Schaltgeschwindigkeit zu erhöhen, aber, soweit ich weiß , nur Intel, globale Hersteller und TSMC sind in der Lage FinFET heute zu schaffen.

Es gibt jedoch noch einige andere Möglichkeiten, die maximale Taktrate einer CPU zu verbessern: Wenn Sie Ihre logische Gleichung in mehrere kleinere aufteilen, können Sie jeden Schritt beschleunigen und eine höhere Taktrate erzielen. Sie benötigen auch mehr Taktperioden, um die gleiche Aktion auszuführen, aber mithilfe von Pipelining-Techniken können Sie die Rate der Anweisungen pro Sekunde an Ihre Taktrate anpassen.

Heute ist die Geschwindigkeit von Elektronen zu einer Grenze geworden: Bei 10 GHz kann sich ein elektrisches Signal nicht mehr als 3 cm ausbreiten. Dies entspricht in etwa der Größe aktueller Prozessoren. Um dieses Problem zu vermeiden, befinden sich möglicherweise mehrere unabhängige synchrone Domänen in Ihrem Chip, wodurch die Einschränkungen für die Signalausbreitung verringert werden. Dies ist jedoch nur ein begrenzender Faktor bei der Schaltgeschwindigkeit der Transistoren, der Wärmeableitung, der EMV und möglicherweise anderen Faktoren (ich bin jedoch nicht in der Siliziumgießerei tätig).


Das sind gute Infos. Ich hatte noch nie gedacht, dass es eine obere Grenze für die Taktrate gibt.
Nick

3
Diese 3 cm bei 10 GHz sind optimistisch. Elektronen in Drähten sind in der Regel etwas langsamer als Photonen in einem Vakuum.
8bittree

6
@ 8bittree: Die Geschwindigkeit der Elektronen ist nicht relevant, oder? Was zählt, ist die Geschwindigkeit des Signals, die viel schneller ist.
Harry Johnston

1
@HarryJohnston Hmm ... laut Wikipedia hast du anscheinend Recht . Aber die Signale selbst sind immer noch langsamer als Licht. Und 3 cm bei 10 GHz basieren auf Licht in einem Vakuum
8bittree

1
Kleinere Transistoren sind nicht nur schneller, Sie können auch mehr auf einem Chip hinzufügen. Es gibt einen Zeit / Raum-Kompromiss für Schaltungen, sodass mehr Transistoren schnellere Schaltungen bedeuten. dh Sie können aus nur ein paar Dutzend Transistoren einen 32-Bit-Addierer machen, aber es würde viele Takt-Ticks erfordern, um eine einzelne Addition zu berechnen. Die neuesten Intel-CPUs schaffen das mit einem Takt, wofür vermutlich 100.000 Transistoren erforderlich sind.
BlueRaja - Danny Pflughoeft

15

Es gibt viele komplexe Variablen, die sich auf die gesamte CPU-Geschwindigkeit auswirken. Eine der Hauptvariablen ist jedoch die Taktrate, die bis Mitte der 2000er Jahre anstieg und dann aufgrund physikalischer Einschränkungen verflacht wurde. In diesem Zeitraum stieg auch der Stromverbrauch pro Chip, um die Chipverluste / -lecks auszugleichen. CPU-Chips wurden einfach zu heiß und die Kühltechnologie wurde wichtiger und mehr Leistung konnte nicht angewendet werden (ohne sie buchstäblich zu schmelzen!).

Extremetech.com gibt eine schöne Umfrage, die darauf hinweist, dass Moores Gesetz vermutlich hauptsächlich von der Dennard-Skalierung angetrieben wird . Letzterer brach Mitte der 2000er Jahre zusammen. Es gibt viele andere Designfaktoren / Verbesserungen bei der "Geschwindigkeit" des Chips (wobei "Geschwindigkeit" als Gesamtcode-Ausführungszeit und nicht nur als Taktgeschwindigkeit gemessen wird), die den Wendepunkt in der Hardware-Fähigkeit wie Caches, CPU-Parallelität / Multicore maskieren , Verzweigungsvorhersage usw., die mit kleineren Gate-Breiten (und daher viel mehr Gates pro Chip für zusätzliche Funktionalität) hinzugefügt wurden. Die Gatterbreiten neigten auch dazu, mit jeder Generation nicht mehr oder zumindest weniger schnell abzunehmen.

Warum sind diese begrenzenden Trends nicht sehr bekannt? Einige der Unternehmen, die die meisten Kenntnisse über diese Trends haben, "haben die meisten zu verlieren" und sind tatsächlich am unwahrscheinlichsten, sie zu veröffentlichen. Zum Beispiel wird Intel, das Milliarden von Dollar wert ist, wahrscheinlich keine firmeneigenen internen Daten veröffentlichen, die auf Einschränkungen oder Leistungsverluste in der Zukunft hinweisen.

Es zeichnen sich neue Möglichkeiten ab, die zu völlig neuen Trends führen könnten (einige beinhalten jedoch fast völlig andere Technologien / Herstellungstechniken), darunter photonische Chips, 3-D-Chips, bei denen Chips in mehreren Schichten abgelegt werden, Quantencomputer und Nanotechnologie wie Nanoröhren Transistoren usw.



Eine Sache, die ich mir lange gewünscht habe, ist die Entwicklung von Betriebssystem- und Sprachunterstützung für das Konzept von Gruppen von Kernen, wobei jede Gruppe ein einheitliches Speichersystem hat und alle Kerne auch Zugriff auf ein gemeinsames Speichersystem haben. Es sollte möglich sein, dass ein Teil des Codes sagt "Ich möchte einen Thread erzeugen, der genau denselben Speicher sieht wie ich" und dass das System sicherstellt, dass alle Threads, die denselben Speicher sehen sollen, auf dem Server ausgeführt werden gleiche Kerne. Einige Algorithmen können viel effizienter gemacht werden, wenn solche Garantien verfügbar sind, aber auf vielen Systemen die einzige ...
Supercat

Um dies zu erreichen, muss eine Anwendung einen CPU-Kern auswählen und es nicht zulassen, dass Threads auf einem anderen ausgeführt werden. Dieser Ansatz ist wirklich ziemlich schrecklich.
Supercat

2
Die Taktraten sind in den letzten 10 Jahren nicht wesentlich gestiegen. Hinzufügen von Kernen, Ausführen von Anweisungssätzen in einer einzigen Anweisung usw. Reduzieren von Engpässen an anderer Stelle, z. Die Speicherbandbreite hat alle maßgeblich zur modernen CPU-Geschwindigkeit beigetragen.
James Ryan

5

Delegation an zusätzliche Prozessoren

Eine weitere Überlegung (neben den anderen tollen Antworten) ist die Delegation von Aufgaben an andere Prozessoren. In den frühen Computertagen gab es nur einen Prozessor. Bei Grafiken wurde die Berechnung mit anderen Berechnungen in derselben CPU geteilt. Jetzt haben wir separate Prozessoren für die Grafikverarbeitung.

Mehrere Kerne

Viele der modernen Prozessoren haben mehrere Kerne in einem Stück Silizium. Da sie dasselbe Stück Silizium teilen, werden sie durch die Verlangsamung der Übertragung des Chips auf einen anderen Kern / Prozessor weniger beeinträchtigt. Beispiel: Grafikprozessoren.

Speicher- und Adresserweiterung

Die frühen 8-Bit-Mikroprozessoren hatten einen kleineren Adressierungsbereich als die heutigen 32-Bit- und 64-Bit-Prozessoren. Die modernen Prozessoren verfügen über einen erweiterten Speicherbereich, sodass mehr Berechnungen im Speicher ausgeführt werden können, als auf externen Speicher zugreifen zu müssen.

Dies gilt auch für den On-Chip-Speicher. Der größere Adressraum ermöglicht größere Speicher, die näher am zentralen Kern liegen, während ein großer Adressraum außerhalb des Siliziums verbleibt.

Pipelines und Caches

Da der Speicher immer billiger wird, implementieren moderne Computer jetzt komplexere Daten- und Anweisungs-Pipelines sowie Daten- und Anweisungs-Caches. Dies beschleunigt die Ausführung, da weniger langsamerer Speicher (außerhalb des Siliziums) in den internen Cache geladen werden muss. Einige Prozessoren können forSchleifen in ihren Anweisungs-Caches enthalten.

Zusammenfassung

Die heutigen Computer sind viel schneller, nicht nur aufgrund der Fortschritte in der Transistor- und Siliziumtechnologie, sondern auch aufgrund der Übertragung von Aufgaben auf andere Prozessoren / Kerne. Dank des immer schneller und kostengünstiger werdenden Arbeitsspeichers haben Prozessoren viel Arbeitsspeicher in der Nähe der CPU. Adressbereiche ermöglichen mehr Speicher, was bedeutet, dass weniger Daten in den externen Speicher abgerufen werden. Bei größeren Registern können pro Zyklus mehr Daten abgerufen werden (4 Byte bei einem 32-Bit-System, 1 Byte bei einem 8-Bit-System). Mehrere Kerne ermöglichen Parallelisierungsvorgänge, anstatt sie zu serialisieren.


4

Fast alle Fortschritte in der Computergeschwindigkeit kommen aus einem dieser Bereiche:

Kleinere Transistoren

Zwei Dinge ergeben sich aus der Verkleinerung von Transistoren:

  1. Sie sind physisch näher beieinander, sodass die Zeit, die ein elektrisches Signal benötigt, um von der Quelle zum Ziel zu gelangen, geringer ist. So obwohl elektrische Signale reisen nicht schneller als vor 50 Jahren, oft sie reisen jetzt kürzere Entfernungen .
  2. Ein Chip kann mehr Transistoren enthalten, was bedeutet, dass mehr "Arbeit" gleichzeitig erledigt werden kann. Je mehr Transistoren hinzugefügt werden, desto schwieriger ist es, nützliche Arbeit für sie zu finden, aber es werden viele clevere Tricks verwendet (siehe unten).

Mehr "nützliche Arbeit" pro Anweisung

Beispielsweise fehlen einigen Prozessoren Anweisungen zum Multiplizieren oder Teilen von ganzen Zahlen. Stattdessen muss diese Aufgabe mit langsamen Softwareroutinen ausgeführt werden. Das Hinzufügen von Multiplikations- und Divisionsanweisungen beschleunigt die Dinge erheblich. Das Hinzufügen von Gleitkommaanweisungen kann Software beschleunigen, für die Gleitkommazahlen erforderlich sind.

Eine wichtige Möglichkeit, mehr "nützliche Arbeit" pro Anweisung zu erledigen, besteht darin, die Wortgröße zu erhöhen . CPUs, die Operationen mit 32-Bit-Nummern ausführen können, erfordern häufig viel weniger Anweisungen, um dieselbe Aufgabe wie 16-Bit- oder 8-Bit-CPUs auszuführen.

Einige Prozessoren unterstützen Anweisungen, die mehrere Aufgaben gleichzeitig ausführen, insbesondere Anweisungen, die denselben Vorgang für mehrere Datenelemente ( SIMD ) ausführen .

Mehr Anweisungen pro Zyklus

Der "Taktzyklus" ist, wie der Prozessor von seinem aktuellen Zustand in den nächsten Zustand übergeht. In gewissem Sinne ist es die kleinste Arbeitseinheit, die der Prozessor gleichzeitig ausführen kann. Die Anzahl der Taktzyklen, die ein bestimmter Befehl benötigt, hängt jedoch vom Design des Prozessors ab.

Mit dem Aufkommen von Pipeline-Prozessoren wurde es möglich, dass sich separate Befehle "überlappen", dh man würde beginnen, bevor der vorherige beendet war. Bestimmte Befehle können jedoch den nächsten Befehl ungültig machen, der erst bekannt wird, wenn der nächste Befehl teilweise ausgeführt wurde, so dass die Dinge kompliziert werden können. (Pipeline-Prozessoren enthalten Logik, um sicherzustellen, dass alles in Ordnung ist. Die Leistungsmerkmale sind jedoch komplexer.)

Superskalare Prozessoren bringen dies auf die nächste Ebene, wobei zwei Befehle buchstäblich gleichzeitig ausgeführt werden, und die Ausführung außerhalb der Reihenfolge geht einen Schritt weiter, wodurch Befehle außerhalb der Reihenfolge ausgeführt werden können. Diese Funktionen erfordern eine Analyse des Befehlsstroms, um herauszufinden, welche Befehle nicht miteinander in Konflikt stehen.

Obwohl es noch andere solche Tricks gibt (z. B. Verzweigungsvorhersage , spekulative Ausführung ), ist das Gesamtbild wichtiger:

  • Jeder Befehl benötigt eine bestimmte Anzahl von Taktzyklen (nicht unbedingt konstant)
  • Es können jedoch mehrere Anweisungen gleichzeitig ausgeführt werden
  • es gibt also messbare " Anweisungen pro Zyklus ", die für High-End-Prozessoren> 1 sind
  • Aber es hängt sehr stark von der Arbeitsbelastung ab

Mehr Zyklen pro Sekunde

Mit anderen Worten, höhere Taktrate . Die Erhöhung der Taktgeschwindigkeit erhöht nicht nur die erzeugte Wärme, sondern erfordert auch ein viel disziplinierteres Chipdesign, da die Stabilisierungszeit der Schaltung kürzer ist. Wir haben bis in die 2000er Jahre eine Menge Meilen gesammelt, als wir an einige praktische Grenzen stießen.

Daten zur richtigen Zeit am richtigen Ort

Obwohl die Komponenten innerhalb der CPU aufgrund schrumpfender Transistoren immer enger zusammenrücken, sind CPU und RAM immer noch gut 5-10 cm voneinander entfernt. Wenn ein Befehl etwas aus dem RAM benötigt, benötigt dieser Befehl nicht 5 oder 6 Zyklen, sondern etwa 200. Dies ist das von Neumann-Engpassproblem .

Unsere Hauptwaffe dagegen ist der Cache . Es ist wahrscheinlicher, dass auf Daten, auf die kürzlich zugegriffen wurde, erneut zugegriffen wird. Sie werden daher in einem speziellen Speicher (Cache genannt) im CPU-Chip gespeichert, wodurch der Zugriff erheblich beschleunigt wird.

Andere Techniken (wie Pipelining und Verzweigungsvorhersage ) ermöglichen es dem Prozessor jedoch, nützliche Arbeit zu leisten, während er auf das Eintreffen von Daten wartet, und vorherzusagen, welche Daten möglicherweise bald benötigt werden.

Mehrere und / oder spezialisierte Prozessoren

Es ist viel einfacher, Software für einen einzelnen Prozessor zu schreiben als für mehrere Prozessoren. Manchmal lohnen sich jedoch die Vorteile in Bezug auf Leistung, Kosten und Stromverbrauch.

Auch bestimmte Prozessoren eignen sich besonders gut für bestimmte Aufgaben. Beispielsweise wurden GPUs speziell für die Berechnungen entwickelt, die zum Rendern von 2D- und 3D-Grafiken und -Effekten erforderlich sind.

Multi-Core-Prozessoren sind im Wesentlichen mehrere Prozessoren auf einem einzigen Chip.


3

Wenn Computer mehr Berechnungen pro Zeiteinheit ausführen können, gelten sie als schneller. Jede Berechnung kann möglicherweise nicht schneller als zuvor ausgeführt werden, es werden jedoch mehr Berechnungen ausgeführt. Eine gute Analogie wäre die Anzahl der Schritte, die ein Läufer unternimmt. Wenn sich ein Läufer nach Moores Gesetz verhält, kann er alle zwei Jahre doppelt so viele Schritte unternehmen. Im Wesentlichen würde der Läufer die doppelte Strecke in der gleichen Zeit zurücklegen wie vor zwei Jahren. Entfernung geteilt durch Zeit ist gleich Geschwindigkeit. 2 x Distanz entspricht 2 x Geschwindigkeit.


3

Die Rechenleistung eines Computers / einer CPU hängt davon ab, wie schnell Strom fließt, sondern wie schnell er ein- und ausgeschaltet werden kann. Je schneller Sie zwischen fließendem und nicht fließendem Strom wechseln können, desto mehr Informationen können Sie in einer CPU verarbeiten oder über die Leitung übertragen.


2

Bei typischen Prozessoren, die in PCs verwendet werden, war die Wärmeabgabe über ein Jahrzehnt ein begrenzender Faktor, während luftgekühlte Prozessoren in PCs auf etwa 4 GHz begrenzt waren. Die Wasserkühlung erhöht dies auf ungefähr 5 GHz, und die Stickstoffkühlung wurde verwendet, um die Taktraten auf ungefähr 6 GHz bis 6,5 GHz zu erhöhen.

Die Taktrate ist im Wesentlichen eine Funktion der Spannung in Abhängigkeit von der logischen Größe der Schaltung (wie lange es dauert, bis ein Schalter seinen Zustand ändert). Je höher die Spannung oder je kleiner die Schaltungslogik ist, desto schneller ist die Rate, dies führt jedoch zu einem Wärmeableitungsproblem, da die Dichten typischerweise zusammen mit einer Verringerung der Schaltungslogikgröße zunehmen. Durch die hohe Dichte bleibt nicht viel Platz für wärmeleitendes Material, um die Wärme abzuleiten. Das Verringern der Dichte erhöht die Kosten und erhöht auch die Ausbreitungsverzögerungen aufgrund längerer Schaltungslängen.

Prozessoren sind in den letzten Jahren nicht viel schneller geworden, der aktuelle Intel i7 4790K (4,0 GHz, 4,4 GHz Turbo) ist nicht viel schneller als der Intel i7 2700K (3,5 GHz, 3,9 GHz Turbo) der zweiten Generation als es ist schneller Taktrate (ca. 14,3% schneller). Auf der anderen Seite hat die Leistung von Grafikkarten in den letzten 4 oder 5 Jahren um den Faktor 3 zugenommen, da 3D-Grafiken Parallelbetrieb nutzen können. Einige haben das Äquivalent von mehr als 3.000 Sub-Cores.


2

Obwohl die bereits gegebenen Antworten gut sind, scheinen sie alle sehr kompliziert zu sein!

Die schnelle "TLDR" -Antwort lautet "Anzahl der Logikgatter" und "wie schnell können diese Logikgatter feuern". Stellen Sie sich die logischen Gatter wie Einsen und Nullen vor. Dies ist nur ein Transistor / eine Vakuumröhre / was auch immer ein- oder ausgeschaltet wird. 1 ist an 0 ist aus.

Strom bewegt sich nicht schneller oder langsamer, aber Sie können mehr Einsen und Nullen auf Ihren Chip schreiben, da die Einsen und Nullen selbst kleiner sind. Und Sie können sie mit der Zeit schneller drehen lassen. Ist das eine etwas einfachere Antwort?


2

Die beiden mit Abstand größten Faktoren sind die Tatsache, dass die Transistoren lächerlich geschrumpft sind, und daher haben wir jetzt Smartphones mit weit über einer Milliarde Transistoren, und die Tatsache, dass das Umschalten eines Transistors von einem Zustand in einen anderen viel schneller geworden ist. Das schnellere Umschalten führt direkt zu mehr Geschwindigkeit. Die höhere Anzahl von Transistoren erhöht indirekt die Geschwindigkeit, da viele andere Verbesserungen möglich sind: Wir haben Caches, weil wir mehr Transistoren haben. Wir haben mehr und größere Register, weil wir mehr Transistoren haben. Wir haben Vektoranweisungen, weil wir mehr Transistoren haben. Wir haben zwei-, vierkernige oder zehnkernige Prozessoren, weil wir mehr Transistoren haben.

In viel geringerem Maße haben wir Geschwindigkeitsverbesserungen aufgrund des besseren Designs. Zum Beispiel ist ein Multiplikator nicht nur schneller, weil wir mehr Transistoren haben, sondern weil wir bessere Methoden verwenden. Die Verzweigungsvorhersage hat sich dahingehend verbessert, dass nicht nur mehr Transistoren verfügbar sind. Alles in allem ist dies jedoch ein geringer Effekt im Vergleich zur brachialen Leistung eines Milliarden-Transistors.

(Der Prozessor des ersten Mac wurde als Motorola 68000-Prozessor bezeichnet, da er 68000 Transistoren hatte. Ein neues iPad verfügt über etwa 20.000-mal mehr).


0

Ich bin Maschinenbauingenieur, daher weiß ich nicht, inwieweit sich dies auf die Geschwindigkeit eines Prozessors auswirkt oder ob er zu einem begrenzenden Faktor geworden ist oder nicht, aber die Physik dahinter ist solide. Die Induktivität und Kapazität des Stromkreises beeinflussen, wie schnell die digitalen Spannungssignale ansteigen und abfallen können - was sich auf die Schaltgeschwindigkeit auswirkt. Im Idealfall wären die Schaltsignale schöne Rechteckwellen. In Wirklichkeit sind sie leicht deformiert und an den Rändern geneigt. Die Signale müssen hoch gehen und lang genug sein, um vor dem nächsten Taktzyklus gelesen zu werden. Grundsätzlich benötigt die Signalwelle oben einen "Flat Spot". Wenn Sie zu schnell schalten, erhalten Sie mehr ein Spitzenwellensignal. Diejenigen von Ihnen, die mit digitalen Signalen besser vertraut sind, können dies bei Bedarf klären, aber die Idee ist richtig.


2
Herzlich willkommen! Soweit ich weiß, ist alles, was Sie sagen, wahr. Aber ich verstehe nicht, wie es die Frage beantwortet, wie Computer im Laufe der Jahre schneller werden konnten.
David Richerby
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.