große integer-addition mit CUDA

Ich habe die Entwicklung eines kryptografischen Algorithmus auf der GPU und derzeit stecken mit einem Algorithmus durchführen zu großen integer-addition. Große Ganzzahlen dargestellt werden, in einer üblichen Weise als eine Reihe von 32-bit-Worten.

Zum Beispiel, können wir einen thread zum addieren zwei 32-bit-Worten. Für Einfachheit, lassen vermuten
dass die zahlen, die Hinzugefügt werden, sind von der gleichen Länge und die Anzahl der threads pro block == Anzahl der Wörter. Dann:

__global__ void add_kernel(int *C, const int *A, const int *B) {
     int x = A[threadIdx.x];
     int y = B[threadIdx.x];
     int z = x + y;
     int carry = (z < x);
     /** do carry propagation in parallel somehow ? */
     ............

     z = z + newcarry; //update the resulting words after carry propagation
     C[threadIdx.x] = z;
 }

Ich bin mir ziemlich sicher, dass es einen Weg gibt, zu tragen, Ausbreitung über einige knifflige Reduzierung Verfahren aber konnte es nicht herausfinden..

Hatte ich einen Blick auf CUDA-Schub-Erweiterungen aber große integer-Paket scheint nicht zu realisieren noch.
Vielleicht kann jemand mir einen Tip geben, wie zu tun, die auf CUDA ?

  • Die GPU kann mit bis zu 64 bit (long long) direkt. Ein Ansatz für 128-bit ist beschrieben im dies ALSO Frage/Antwort.
  • Ich denke, was willst du von CUDA erreicht werden kann, von C-Techniken. Daher habe ich retaged die Frage in C zu. Hoffe auf nette Antwort von den C-Experten.
  • Ja, Sie können auch das Programm einer long-integer-addition mit nur high-level-C-Konstrukte (im Gegensatz zu PXT linline Montage in CUDA), aber es würde deutlich mehr Anweisungen, als ich darauf hinwies, in dieser Antwort auf: stackoverflow.com/questions/12448549/...
  • vielen Dank für die Anregungen. Ich weiß, dass CUDA unterstützt spezielle systeminterne Funktionen zu verwenden carry-flag nach Ergänzungen. Der Punkt ist, die zahlen können sehr groß (über 2048 32-bit-Worte) also ich bin wirklich auf der Suche für eine parallele Lösung, vielleicht über parallele Reduktion irgendwie ?
  • Außerdem ist überträgt sich rein rechnerisch nicht intensiv genug ist, um sinnvoll aufgeteilt auf mehrere threads (zumindest aus der Spitze von meinem Kopf). Für die Multiplikation, Sie könnten jeden thread arbeiten auf der Summierung einer Spalte teilweise 32x32->64-bit-Produkte, dann propagieren der trägt am Ende. Sie konnten auch einen Blick in die latenten tragen Vermehrung, indem Sie die Ergebnisse einer Zusatz as separate Summen-und carry-Vektoren. Viel hängt von der genauen algorithmischen Kontext.
  • ja, ich Stimme zudem nicht, dass rechenintensive als Multiplikation. Aber immer noch, wenn ich eine integer der Länge 2048 oder noch mehr Worte, dabei zusätzlich in einer Schleife mit einem CUDA-thread wäre sehr innefficient, weil dieser Vorgang sieht embarrasingly parallel zu mir, außer für die Fortpflanzung.
  • Ich habe gehackt zusammen ein cuda-kernel zu tun, die parallele Zugabe von bis zu 1024 64-bit-unsigned-Mengen, und in der Lage zu handhaben Chargen dieser Probleme parallel auch. Ein kernel-Berechnung Standpunkt, und wenn wir Chargen einer großen Anzahl von Problemen in parallel, es ist über 10x schneller als meine naiven CPU-code. Wenn Sie werfen in die Daten kopieren Zeit, es ist in etwa auf Augenhöhe mit der CPU-Zeit. Es gibt keine PTX -, nur C-code, also ich bin mir sicher, dass es gemacht werden könnte, um schneller zu laufen, aber ich weiß nicht, wie viel. Ich poste es als Antwort, wenn Sie wollen, um es zu betrachten. Auch mache ich keine Ansprüche über seine Richtigkeit.
  • Den folgenden link für CUDA-Schub-Erweiterungen enthält den code für große integer-Multiplikation: cuda-thrust-extensions.googlecode.com/svn/trunk/big%20integer

InformationsquelleAutor | 2012-10-18
Schreibe einen Kommentar