Alexander Kornrumpf hat geschrieben:Krishty hat geschrieben:Natürlich können sie es schnell. Man muss ja sogar streuen, um verschiedene Bänke simultan zu treffen und so.
Das wage ich mal ganz stark zu bezweifeln, erstens weil es in ungefähr jedem Paper was ich bislang gelesen habe anders steht, und zweitens weil das Bankargument wenn ich mich recht erinnere einfach Blödsinn ist. Wenn ich mich jetzt nicht schwer täusche ist das Adressierungsschema im Shared Memory so, dass konsekutive Speicheradressen in verschieden Bänken liegen um genau das Problem zu vermeiden.
Okay – ich teste es, sobald ich den Compiler so weit habe, effiziente Zugriffe einzusetzen.
Alexander Kornrumpf hat geschrieben:Ich verstehe auch nicht was das "der Compiler lässt mich nicht" heißen soll. Jeder Thread soll "sein" Element lesen, verarbeiten und schreiben. Das ist binär. Entweder man macht es "richtig" oder eben nicht.
Es gibt mehrere Arten und Weisen, wie geschrieben werden kann – die sind von der Sichtbarkeit des Zugriffs und von seiner Größe abhängig, und darüber hinaus davon, ob er atomar geschehen soll oder nicht. Ich kann im Shader nur
target[xy] = 0.0f; schreiben. Und der Compiler wählt automatisch die langsamstmögliche Methode aus. Mein Fehler scheint es nicht zu sein, sonst hätten mich MS und AMD längst drauf hingewiesen.
Alexander Kornrumpf hat geschrieben:Dochdoch, die Daten sind toll, das Schreib-Layout ist optimiert. Der Grund ist, dass die Compiler einen Speicherpfad erzwingen, der normalerweise für Daten ungerader Größe vorgesehen ist, die global synchronisiert werden müssen. Aber was der Sinn dahinter ist, darüber schweigen mich alle nur an. Ich sage: menschliches Versagen.
CUDA unterstützt keine globale Synchronisierung. Es geht einfach nicht. Weil es langsam wäre. Wenn ATi/AMD das verbockt haben sollten dann erklär doch nicht deshalb GPGPU für gescheitert.
Entschuldige – ich meinte nicht „global synchronisiert“ sondern „global sichtbar“. Und verbockt hat es nicht nur AMD, sondern auch Microsoft. Und entweder hat Nvidia sein Mitspracherecht bei der DirectX- und OpenCL-Spezifikation dafür missbraucht, es größtmöglich scheitern zu lassen damit Cuda besser dasteht, oder hat auch Mitschuld an der Misere.