Blowfish mit CUDA Dominik Oepen 22.07.2008. Inhalt ● Blowfish Grundlagen ● Implementierungsdetails ● Performance ● Fazit.

Slides:



Advertisements
Ähnliche Präsentationen
4.5 Virtueller Speicher Problemsituation: Programme und Daten sind zu groß für den verfügbaren Arbeitsspeicher Frühere Lösung Aufspaltung der Programme.
Advertisements

< CUDA implementation>
Constantin Timm Informatik 12 TU Dortmund
Übung 6.6Schranken 1.Angenommen, Ihr Algorithmus habe einen Aufwand von g(n) = 5n 3 + n für alle n a)Geben sie eine obere Schranke O(g(n)) an. b)Beweisen.
(kleine!) Java Einführung Mittwoch, Heute Ziel: erstes Java-Programm erstellen Von der Aufgabenstellung bis zur Lösung Grundlagen Einfache.
SAP R/3 - Speichermanagement
10 Streams JavaHS Merseburg WS 05/06 E/A - Ströme (Streams) in Java.
Java: Dynamische Datentypen
Tag 2 Look-up-Tabellen, Zufallszahlen, Listen, Speichermanagement und Dateiverwaltung Quelle: 3D-Spiele mit C++ und DirectX in 21 Tagen, Alexander.
1 Named Pipes alias FIFO Haben einen Eintrag im Dateisystem und sind somit durch Zugriffsrechte identifizierbar Ermöglichen die Kommunikation zwischen.
Blockchiffren Projektarbeit zum Thema Kryptographie
Vortrag III Hier in der Vorlesungszeit! Anwesenheitspflicht Jede Gruppe hat 6 Minuten! Stellt eure GUI vor –was ihr besonderes gemacht habt –Spektakuläre.
Modulare Programmierung
Der VFP Debugger - Coverage und Profiling. © 1999 TMN-Systemberatung GmbH Der VFP Debugger n Neues Aussehen, eigene Task n Erweiterte Möglichkeiten n.
Inhalt Der Cell Prozessor Aufbau des Cells Platine Block Diagramm
Random Heightmap on GPU
Matrix Multiplication on CUDA
< Best practices >
Beschleunigung Virtueller Privater Netze durch Netzwerkprozessoren
Leitfaden Motivation Was ist CUDA ? NVIDIA Grafikkarte Programmierung
SOMA Service-Oriented Mobile learning Architecture.
KRYPTOGRAFIE.
GWDG – Kurs Parallelrechner-Programmierung mit MPI MPI Punkt-zu-Punkt-Kommunikation Oswald Haan
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Clustering mittels Grafikprozessor
Basic Input/Output System
Effiziente Algorithmen
GPU Computing Burim Kameri Fachhochschule Hannover (FHH)
GPU Computing Burim Kameri Fachhochschule Hannover (FHH)
3.3 Speicher Latches SR-Latch 1-bit Speicher S Q Q R Q Q
1 SR-Latch 3.3 Speicher Latches © Béat Hirsbrunner, University of Fribourg, Switzerland, 31. Oktober 2007 S Q Q R Q Q 1-bit Speicher.
Signal-Prozessoren DSV1, 2009, Hhrt, 1 Mikro-Prozessor Von Neumann-Architektur Daten und Programmcode im gleichen Speicher => Sequenzieller Zugriff auf.
Computerorientierte Physik VORLESUNG
Dynamische Datentypen
Grundlagen der Informatik
Ein Vortrag von Simon Bayer
Thread Synchronisation in JAVA
Objectives Verstehen was unterDelegate verstanden wird
Multiprozessoren: Herausforderung für die Software
Agenda für heute, 12. Mai, 2005 ProzedurenProzeduren Funktionsprozeduren Prozedurparameter Lokale und globale Variablen Datentypen: Ordinaltypen.
Betriebssysteme Übung Tutorium „TLB & Virtual Memory“
JOMP
Parallelisierung für Multiprozessor-Maschinen
Hypertransport.
SFZ FN Sj. 13/14 Python 3 Rekursion Inf K1/2 Sj 13/14
Directors Prof. Dr.-Ing. K.D. Müller-Glaser Prof. Dr.-Ing. J. Becker Prof. Dr. rer. nat. W. Stork Institute for Information Processing Technology.
Autor: Timo Pagel Nutzung: Diese Lernkarten sind für die Nutzung mit OpenCards gedacht Siehe dazu
F.A.D.E. Feigl‘s and Albrecht‘s Destructive Editor Implementierung eines sicheren Schutzes von Shareware.
Bs Segmentierung Adressraum besteht aus mehreren Segmenten (segments), die unabhängig voneinander manipulierbar sind. Segmentierungsstruktur ist.
Lehrstuhl für Informatik 3 - D. Fey Vorlesung GRa - SS , Folie 1 Beispiel Cache-Architektur.
Aachen, Seminarvortrag Von: Lukas Abels-Vehns OpenCL mit Aparapi.
Technische Universität München, Informatik XI Angewandte Informatik / Kooperative Systeme Verteilte Anwendungen: Einflußreiche Systeme Dr. Wolfgang Wörndl.
Import java.util.*; Hilfsklassen, die man eigentlich immer braucht.
Paralleleles Rechnen auf Grafikkarten Einführung Christian Schwarz.
Center for Biotechnology Bielefeld Bioinformatics Service Netzwerk - Programmierung Kommunikation von Prozessen Signale und Pipes Alexander Sczyrba
LINUX II Unit Remote Zugriff via SSH.
Lineare Algebra Softwareprojekt: Anwendung von Algorithmen Sebastian Kürten, Philipp Borgers SoSe 2010.
Netzwerk - Programmierung
SAS Backstage Biljana Gigić1, Andreas Deckert2
DOAG SID Data Warehouse
K-NN Klassifikation auf dem STI Cell BE Prozessor Michael Mair, Adrian Marte, Martin Schöpf, Daniel Winkler.
Vom HW-Automaten zum Prozessor
Indexierung Oracle: indexes Indexierung.
Raphael Fischer Informatik II - Übung 05 Raphael Fischer
CSL211 Computer Architecture
TRACKING Quelle: Fotolia by Adobe.
Ich - Projekt Due Monday, September 19..
- moodle – a internet based learning platform
Shared Memory Programmierung: Grundlagen
 Präsentation transkript:

Blowfish mit CUDA Dominik Oepen

Inhalt ● Blowfish Grundlagen ● Implementierungsdetails ● Performance ● Fazit

Blowfish Basics

Was ist eine Blockchiffre ● Eingabestrom wird in gleich große Blöcke zerlegt ● Blöcke werden einzeln ver-/entschlüsselt

Funktionsweise Blowfish ● S-Boxen: 4 Arrays mit jeweils Bit integer Werten ● P-Array: 18 konstante 32 Bit Werte ● P und S Boxen werden mit verwendetem Schlüssel verknüpft ● Permutationen, etc. in Abhängigkeit von den Boxen

Modi für Blockchiffren ● ECB ● CBC ● OFB ●... ● Key diversity: Schlüssel wird für jeden Block mit Blockindex per XOR verknüpft => anderer Schlüssel für jeden Block, weiterhin parallelisierbar

Implementierte Modi ● ECB ● Key diversyity ● Key diversity hat extremen Speicherbedarf: 1024 mal so viel Speicher für S-Boxen wie für Input => geringer Grad an Multiprogramming => CUDA Implementierung bringt kaum Vorteile

Implementationsdetails

Programmablauf ● Lade Daten in GPU Speicher ● Initialisiere S-Boxen und P-Array im globalen Grafikkartenspeicher ● Jeder Thread verschlüsselt einen Block (64 Bit) ● Mehrere Durchläufe des Kernels mit fester Anzahl an Threads ● Kopiere verschlüsselte Daten zum Host

Speicheraufteilung - ECB ● S-Boxen verknüpft mit Schlüssel im globalen Speicher der Grafikkarte ● __device__ > Blowfish_Init ● Nicht parallelisiert (Race conditions möglich), aber nur geringer Aufwand ● Jeder Thread verschlüsselt einen Block (2 uint32_t Werte => 64 Bit)

Speicheraufteilung – ECB optimiert ● Eine Kopie der S-Boxen in shared Memory pro Block ● CUDA Block Größe: 256 Threads/Block => jeder Thread kopiert einen Wert der S-Boxen ● Zu verschlüsselnde Daten werden in den lokalen Speicher der Threads kopiert. ● Nach Verschlüsselung kopieren der Ergebnisse in globalen Grafikkartenspeicher, von dort zum Host

Quellcode ● Blowfish-cuda.cu enthält Host Programm mit kernel Aufrufen ● blowfish-kernel.cu enthält Kernel und device Funktionen

Performance Messungen

Verwendete Plattform ● Intel Core 2 Duo 8400 (3 GHz, 4 MB Cache) ● 4 GByte DDR2-800 RAM ● Ubuntu 8.04 (64 Bit), Kernel ● CUDA 2.0 Beta ● NVIDIA Treiber

Methode ● Gemessen wurde die Verschlüsselung von einer 50 einer 100, einer 200 und einer 300 MByte großen Datei ● Es wird nur die Rechenzeit (ohne I/O) gemessen, mittels gettimeofday => mikrosekunden Auflösung ● Erwartung: CUDA Implementierung lohnt sich erst bei großen Dateien

Vergleich der Varianten

● CUDA ohne shared memory => Speedup von ungefähr 2 gegenüber Pthreads ● CUDA mit shared memory => Speedup von ungefähr 3 gegenüber Pthreads ● Shared memory => Speedup von ca. 0,5

ECB mit shared memory

Vergleich mit OpenSSL ● CUDA nur minimal schneller als OpenSSL ● CUDA 4096 Threads vs. OpenSSL 0.9.8g: 2,9s vs 3,2s Gemessen mit time, inklusive I/O, stark schwankende Ergebnisse

Analyse mit CUDA Visual Profiler

● Shared memory ist static ● Großteil der Speicherzugriffe ist “uncoalesced” => Serialisierung der Threads => großes Optimierungspotential ● GPU ist komplett ausgelastet (ohne shared memory nur Auslastung von 0,33) ● Siehe Analyse.csv

Verschmolzene Speicherzugriffe ● The simultaneous global memory accesses by each thread of a half- warp (16 threads on G80) during the execution of a single read or write instruction will be coalesced into a single access if: – The size of the memory element accessed by each thread is either 4, 8, or 16 bytes – The elements form a contiguous block of memory – The Nth element is accessed by the Nth thread in the half-warp – The address of the first element is aligned to 16 times the element’s size

Globale Speicherzugriffe __shared__ uint32_t shared_S[4][256]; shared_S[0][threadIndex] = ctx_S[0][threadIndex]; shared_S[1][threadIndex] = ctx_S[1][threadIndex]; shared_S[2][threadIndex] = ctx_S[2][threadIndex]; shared_S[3][threadIndex] = ctx_S[3][threadIndex]; In __global__ void Blowfish_Encrypt256: In __device__ void do_decryption: Xl = data[index]; Xr = data[index + 1];... data[index] = Xl; data[index + 1] = Xr;

Optimierungsmöglichkeiten ● Daten in Texturspeicher laden ● Daten für jeden Block in shared Memory laden ● Vor dem Zurückschreiben der Daten __synchthreads() für verschmolzenen Speicherzugriff

Fazit ● Grundsätzlich ist es recht einfach ein CUDA Programm zu schreiben ● Debugging ist schwierig (keine Host Funktionen, Emulationsmodus liefert teilweise andere Ergebnisse als reale Ausführung) ● Optimierung ist schwierig, CudaVisualProfiler ist ein gutes Werkzeug um Bottlenecks zu finden ● Hauptschwierigkeit: Organisation des Speichers (in meinem Fall)

Verwendete Quellen ● CUDA Programming Guide: CUDA_Programming_Guide_1.1.pdf CUDA_Programming_Guide_1.1.pdf ● General Purpose Computation on the GPU: ● CUDA Tutorial: A_Tutorial_No_NDA_Apr08.pdf A_Tutorial_No_NDA_Apr08.pdf ● GPGPU Course: