{"id":638,"date":"2015-10-19T11:24:06","date_gmt":"2015-10-19T11:24:06","guid":{"rendered":"http:\/\/coolt.ch\/notizen\/?p=638"},"modified":"2015-10-19T13:26:00","modified_gmt":"2015-10-19T13:26:00","slug":"cuda-introduction","status":"publish","type":"post","link":"https:\/\/coolt.ch\/notizen\/cuda-introduction\/","title":{"rendered":"CUDA Introduction: Sprache"},"content":{"rendered":"<p>Cuda ist von Nvidia eine Sprache wie auch Architektur zur GPU-Verarbeitung<strong>. <\/strong>Die Sprache wird im Buch <a href=\"http:\/\/coolt.ch\/notizen\/wp-content\/uploads\/2015\/10\/CUDA_by_Example_Addison_Wesley_Jul_2010.pdf\">CUDA_by_Example. <\/a>ausf\u00fchrlich beschrieben. Einen ersten \u00dcblick gibt folgender Vortrag, der vom Autor desselben Buches ebd. \u00fcber <a href=\"http:\/\/coolt.ch\/notizen\/wp-content\/uploads\/2015\/10\/2131_gtc2010.pdf\">Cuda_Introduction<\/a> gegeben wurde.<\/p>\n<p><strong>Kompiler<\/strong><br \/>\nnvcc<\/p>\n<p><strong>Trennung: Ablage in GPU &#8211; CPU<\/strong><br \/>\nDer nvcc-Kompiler trennt den Code in CPU-Speicher und GPU-Speicher.<br \/>\n&#8211; Device-Funktionen werden im<strong>\u00a0<\/strong><span class=\"lang:sh decode:true crayon-inline \">kernel()<\/span>\u00a0 bearbeitet und im GPU-Speicher abgelegt.<br \/>\n&#8211; Normale Funktionen werden im der CPU (host) im <span class=\"lang:sh decode:true crayon-inline \">main()<\/span>\u00a0 bearbeitet und ihre Variablen liegen im Speicher der CPU. Kompiliert wird mit\u00a0 gcc.<\/p>\n<pre class=\"lang:sh decode:true\">int main( void) {\r\n    kernel &lt;&lt;&lt; 1, 1 &gt;&gt;&gt; ();\r\n    printf(\"hallo \\n\");\r\n    return 0;\r\n}<\/pre>\n<p><strong><br \/>\nVon CPU auf GPU<\/strong><br \/>\n<span class=\"lang:sh decode:true crayon-inline\">__global__<\/span> :\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cuda Schl\u00fcssewort f\u00fcr Funktionen die auf GPU laufen,<br \/>\n.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Diese Funktionen m\u00fcssen\u00a0 von CPU &#8211; im main() &#8211; aufgerufen<br \/>\n.\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 werden<br \/>\n<span class=\"lang:sh decode:true crayon-inline\">&lt;funktion&gt; &lt;&lt;&lt;<\/span> :\u00a0\u00a0\u00a0\u00a0 Befehl zum Ausf\u00fchren der Funktion auf der GPU<br \/>\n<span class=\"lang:sh decode:true crayon-inline \">&gt;&gt;&gt; &lt;parameter&gt;<\/span> : \u00a0 Mitgabe der Argumente f\u00fcr die GPU-Funktion.<\/p>\n<p><strong>Bsp.<\/strong><\/p>\n<pre class=\"lang:sh decode:true \">__global__ void kernel( void ) { \r\n} \r\n\r\n__global__ void add (int *a, int *b, int *c)\r\n{\r\n *c = *a + *b;\r\n}<\/pre>\n<p>Dies funktioniert nur, wenn man im main() die Funktion auf die GPU verschiebt.<em><br \/>\n<\/em><\/p>\n<pre class=\"lang:sh decode:true\">int main( void) {\r\n    int a, b, c;\r\n    int *dev_a, *dev_b, *dev_c;\r\n\r\n    \/\/ Funktion auf GPU   \/\/ Argumente mitgeben\r\n    add &lt;&lt;&lt; 1, 1 &gt;&gt;&gt; (dev_a, dev_b, dev_c);\r\n    printf(\"hallo \\n\");\r\n    return 0;\r\n}<\/pre>\n<p>CPU (host) ruft GPU (device) auf. Ist notwendig, um eine <em>Funktion auf der GPU<\/em> aufzurufen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Cuda ist von Nvidia eine Sprache wie auch Architektur zur GPU-Verarbeitung. Die Sprache wird im Buch CUDA_by_Example. ausf\u00fchrlich beschrieben. Einen ersten \u00dcblick gibt folgender Vortrag, der vom Autor desselben Buches ebd. \u00fcber Cuda_Introduction gegeben wurde. Kompiler nvcc Trennung: Ablage in GPU &#8211; CPU Der nvcc-Kompiler trennt den Code in CPU-Speicher und GPU-Speicher. &#8211; Device-Funktionen werden &hellip; <a href=\"https:\/\/coolt.ch\/notizen\/cuda-introduction\/\" class=\"more-link\"><span class=\"screen-reader-text\">CUDA Introduction: Sprache<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[14,62],"tags":[],"_links":{"self":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/638"}],"collection":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/comments?post=638"}],"version-history":[{"count":5,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":651,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/posts\/638\/revisions\/651"}],"wp:attachment":[{"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/media?parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/categories?post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coolt.ch\/notizen\/wp-json\/wp\/v2\/tags?post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}