{"id":2635,"date":"2017-12-30T18:35:39","date_gmt":"2017-12-30T18:35:39","guid":{"rendered":"http:\/\/www.colorwave.it\/blog\/?p=2635"},"modified":"2018-01-27T16:19:46","modified_gmt":"2018-01-27T16:19:46","slug":"gpu_program","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/gpu_program\/admin\/2017\/12\/","title":{"rendered":"gpu_program"},"content":{"rendered":"<p>Un&#8217;istanza della classe gpu_program viene creata ogni volta che viene caricato un programma opencl da eseguire. Il database dei programmi opencl viene sempre caricato ad inizializzazione dell&#8217;applicazione. Tutti i programmi OpenCL sono caricati in forma di codice sorgente e la loro compilazione avviene a seguito della prima richiesta di esecuzione di uno dei kernel presenti. ogni programma \u00e8 incapsulato nella classe <em>gpu_program<\/em>, mentre\u00a0 il database dei programmi \u00e8 gestito dalla classe\u00a0<em>gpu_programs_db.\u00a0\u00a0<\/em>Notare che non\u00a0\u00a0c&#8217;\u00e8 necessit\u00e0 di utilizzare direttamente la classe gpu_program_db, poich\u00e9\u00a0 l&#8217;accesso al database dei programmi e la loro compilazione \u00e8 effettuata automaticamente dall&#8217;infrastruttura del namespace OPCL.<\/p>\n<p>Anche le istanze della classe gpu_program non sono in genere direttamente usate, e sono generate e gestite in modo completamente trasparente nella funzione<\/p>\n<p style=\"text-align: center;\"><em>OPCL::GPU::OpenKernel(prog_name, kernel_name);<\/em><\/p>\n<p>che genera un kernel da eseguire.<\/p>\n<p>La classe espone un insieme di metodi e funzioni utilizzate dall&#8217;infrastruttura per eseguire automaticamente la compilazione ed il caricamento su un device del programma eseguibile. Il programma \u00e8 compilato utilizzando il compilatore OpenCL del device assegnato; Se sulla piattaforma sono presenti pi\u00f9 device, il programma \u00e8 compilabile ed eseguibile su ciascuno di essi;<\/p>\n<pre class=\"lang:default decode:true\" title=\"la classe gpu_program\">\tclass AFX_EXT_CLASS gpu_program\r\n\t{\r\n\tpublic:\r\n\r\n\t\tgpu_program (STRING name, char *src, gpu_device *device );\r\n\t\t~gpu_program ( );\r\n\r\n\t\tgpu_device *Device ( );\r\n\r\n\t\tchar *Source ( );\r\n\r\n\t\tcl_program Id ( );\r\n\r\n\t\tgpu_kernel *OpenKernel ( char *function_name );\r\n\r\n\t\tgpu_program_str pdata;\r\n\t};\r\n<\/pre>\n<h4>gpu_program (STRING name, char *src, gpu_device *device );<\/h4>\n<p>il costruttore genera ed inizializza un programma dato il suo nome, il codice sorgente ed un device di esecuzione; come gi\u00e0 scritto, le istanze della classe sono generate in modo trasparente dall&#8217;infrastruttura, e non c&#8217;\u00e8 necessit\u00e0 di utilizzare direttamente questo costruttore;<\/p>\n<h4>Source()<\/h4>\n<p>Il codice sorgente del programma \u00e8 accessibile usando la funzione Source();<\/p>\n<h4>OpenKernel(char *function_name )<\/h4>\n<p>L&#8217;apertura di un kernel OpenCL \u00e8 effettuata attraverso questa funzione; l&#8217;istanza della classe gpu_kernel rimandata \u00e8 utilizzata per eseguire il kernel, dopo averli\u00a0 assegnato gli argomenti. Per una discussione approfondita sull&#8217;esecuzione del kernel leggere l&#8217;articolo che descrive la classe gpu_kernel.<\/p>\n<h4>Id()<\/h4>\n<p>La funzione rimanda l&#8217;handle cl_program del programma compilato in OpenCL; anche questa funzione, come tutte quelle esposte nella classe non ha necessit\u00e0 di essere utilizzata, a meno che non si debbano generare nuove classi nel namespace OPCL.<\/p>\n<h3>Compilazione del\u00a0 programma<\/h3>\n<p>Quando viene generata un&#8217;istanza di<em> gpu_program<\/em>\u00a0<img fetchpriority=\"high\" decoding=\"async\" data-attachment-id=\"2640\" data-permalink=\"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/gpu_program\/admin\/2017\/12\/attachment\/gpu_prog_com_error\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_prog_com_error.jpg?fit=374%2C205&amp;ssl=1\" data-orig-size=\"374,205\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"gpu_prog_com_error\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_prog_com_error.jpg?fit=300%2C164&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_prog_com_error.jpg?fit=374%2C205&amp;ssl=1\" tabindex=\"0\" role=\"button\" class=\"alignleft wp-image-2640 size-full\" src=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_prog_com_error.jpg?resize=374%2C205&#038;ssl=1\" alt=\"\" width=\"374\" height=\"205\" srcset=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_prog_com_error.jpg?w=374&amp;ssl=1 374w, https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_prog_com_error.jpg?resize=300%2C164&amp;ssl=1 300w\" sizes=\"(max-width: 374px) 100vw, 374px\" data-recalc-dims=\"1\" \/>viene eseguita internamente la compilazione del programma OpenCL del quale \u00e8 fornito il sorgente ed il device di esecuzione; se sono presenti errori sintattici verr\u00e0 presentata una finestra come quella riportata di fianco.<\/p>\n<p>nel frammento di codice presentato vengono riportate le coordinate nel testo con l&#8217;indicazione del tipo di errore trovato; Perch\u00e8 un programma OpenCL sia compilato occorrer\u00e0 avere installato correttamente il compilatore ed il driver OpenCL fornito dal produttore del device; In genere, per le schede grafiche che sono compatibili con OpenCL, il software necessario \u00e8 installato sul computer in fase di installazione dei driver;<\/p>\n<p>Nel caso non fosse gi\u00e0 installato il compilatore,<a href=\"https:\/\/www.khronos.org\/conformance\/adopters\/conformant-products#opencl\"> fare riferimento a questa pagina\u00a0 \u00a0sul sito di Khronos per valutare la conformit\u00e0 dell&#8217;hardware a OpenCL.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Un&#8217;istanza della classe gpu_program viene creata ogni volta che viene caricato un programma opencl da eseguire. Il database dei programmi opencl viene sempre caricato ad inizializzazione dell&#8217;applicazione. Tutti i programmi OpenCL sono caricati in forma di codice sorgente e la loro compilazione&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2651,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"image","meta":{"_acf_changed":false,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false},"version":2}},"categories":[29,107],"tags":[],"jetpack_publicize_connections":[],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_prog.jpg?fit=800%2C170&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-Gv","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2635"}],"collection":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/comments?post=2635"}],"version-history":[{"count":12,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2635\/revisions"}],"predecessor-version":[{"id":2652,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2635\/revisions\/2652"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media\/2651"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=2635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=2635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=2635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}