{"id":2586,"date":"2017-10-22T18:33:06","date_gmt":"2017-10-22T18:33:06","guid":{"rendered":"http:\/\/www.colorwave.it\/blog\/?p=2586"},"modified":"2017-12-30T19:02:46","modified_gmt":"2017-12-30T19:02:46","slug":"gpu_platform","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/gpu_platform\/admin\/2017\/10\/","title":{"rendered":"gpu_platform"},"content":{"rendered":"<p>Ogni classe gpu_platform individua e gestisce una delle piattaforme OpenCL la cui list pu\u00f2 essere ottenuta usando la funzione\u00a0 <a href=\"https:\/\/www.khronos.org\/registry\/OpenCL\/sdk\/1.0\/docs\/man\/xhtml\/clGetPlatformIDs.html\">clGetPlatformIDs.<\/a><\/p>\n<p>Le istanza della classe sono in numero pari alle piattaforme hardware presenti, ed una delle specifiche piattaforme \u00e8 ottenibile come descritto nel segmento di codice che segue<\/p>\n<pre class=\"lang:default decode:true\">if (GPU::Open ( ))\r\n{\r\n   for (cl_uint np = 0; np &lt; GPU::NumPlatForms ( ); np++)\r\n   {\r\n\tgpu_platform *platform = GPU::Platform ( np );\r\n        ...........................................\r\n        .......................\r\n        .............\r\n    }\r\n}\r\n<\/pre>\n<p>La gestione delle piattaforme OpenCL \u00e8\u00a0 completamente effettuata all&#8217;interno della classe GPU, sia per l&#8217;allocazione che per il rilascio delle stesse. Una piattaforma pu\u00f2 contenere pi\u00f9 device, ai quali si accede attraverso la funzione platform-&gt;Device(x)\u00a0\u00a0dove x \u00e8 un ordinale valido.<\/p>\n<p>ogni gpu_platform contiene un context\u00a0 OpenCL gestito attraverso la classe gpu_context e visibile attraverso la funzione platform-&gt;Context(); tutti i device\u00a0 della piattaforma accedono allo stesso context.<\/p>\n<p>E&#8217; rara l&#8217;esigenza di accedere direttamente alle funzioni di gpu_platform, a meno che non si intenda scrivere nuove classi del namespace OPCL ed\u00a0 in genere, <a href=\"https:\/\/www.colorwave.it\/blog\/?p=2571\">come gi\u00e0 descritto qui<\/a> , per utilizzare un programma OpenCL (un suo kernel)\u00a0 non \u00e8 necessario ottenere informazioni sulla piattaforma e classi incapsulate;<\/p>\n<p>Analizziamo ora le funzionalit\u00e0 della classe<\/p>\n<pre class=\"lang:default decode:true \" title=\"La classe gpu_platform\">\tclass AFX_EXT_CLASS gpu_platform\r\n\t{\r\n\tpublic:\r\n\t\tgpu_platform ( );\r\n\t\t~gpu_platform ( );\r\n\r\n\t\tcl_platform_id Id ( );\r\n\r\n\t\tchar *Name ( );\r\n\r\n\t\tint NumDevices ( );\r\n\r\n\t\t\/** rimanda il device ord-esimo\r\n\t\t*\/\r\n\t\tclass gpu_device *Device ( int ord );\r\n\r\n\t\t\/** \\brief rimanda il context  della  piattaforma\r\n\t\tdetails il contesto opencl \u00e8 automaticamente definito quando viene inizializzata la struttura gpu_platform dall'interno GPU ed \u00e8 comune a tutti i device\r\n\t\tnella piattaforma;\r\n\t\t*\/\r\n\t\tclass gpu_context *Context ( );\r\n\r\n\r\n\t\t\/** rimanda la descrizione della versione opencl gestita dalla piattaforma\r\n\t\t*\/\r\n\t\tchar *OpenCl_Version ( );\r\n\r\n\t\tfriend class GPU;\r\n\t\tfriend class gpu_context;\r\n\r\n\tprivate:\r\n\t\tbool SetDevices ( int n, cl_device_id *devs );\r\n\t\tbool SetName ( char *name );\r\n\t\tbool SetId ( cl_platform_id id );\r\n\t\tbool SetOpenCL_Version ( char *version );\r\n\r\n\t\t__use_private_struct\r\n\t};\r\n<\/pre>\n<p>Le funzioni private sono usate dalle classi GPU e gpu_context\u00a0 per definire gli attributi durante l&#8217;inizializzazione della infrastruttura nel namespace OPCL;\u00a0 Le altre funzioni permettono di accedere\u00a0 alle istanze gpu_device e gpu_context incapsulate;<\/p>\n<p><div class=\"sparklegrid row\"><div class=\"col-sparkle-16 sparkle-grid\"><img decoding=\"async\" data-attachment-id=\"283\" data-permalink=\"https:\/\/www.colorwave.it\/blog\/framework\/linterfaccia-operation_call\/admin\/2015\/05\/attachment\/fumetto\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2015\/05\/fumetto.png?fit=24%2C24&amp;ssl=1\" data-orig-size=\"24,24\" 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=\"fumetto\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2015\/05\/fumetto.png?fit=24%2C24&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2015\/05\/fumetto.png?fit=24%2C24&amp;ssl=1\" tabindex=\"0\" role=\"button\" class=\"alignleft size-full wp-image-283\" src=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2015\/05\/fumetto.png?resize=24%2C24&#038;ssl=1\" alt=\"\" width=\"24\" height=\"24\" data-recalc-dims=\"1\" \/><\/p>\n<p><strong>T<\/strong>utti gli attributi esposti attraverso i metodi della gpu_platform sono visibili nella finestra richiamabile dal menu dei Tools di\u00a0 Colibri; la finestra presenta inoltre un insieme di caratteristiche utili per individuare le potenzialit\u00e0 delle piattaforme OpenCL installate nel computer in uso; Un&#8217;ultima annotazione: pi\u00f9 piattaforme e device possono essere presenti nella stesso host, tutti utilizzabili attraverso le classi del namespace <em>OPCL<\/em>.<\/div>\u00a0<\/div> <img fetchpriority=\"high\" decoding=\"async\" data-attachment-id=\"2598\" data-permalink=\"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/gpu_platform\/admin\/2017\/10\/attachment\/display_gpu_info\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/display_gpu_info.png?fit=481%2C189&amp;ssl=1\" data-orig-size=\"481,189\" 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=\"display_gpu_info\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/display_gpu_info.png?fit=300%2C118&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/display_gpu_info.png?fit=481%2C189&amp;ssl=1\" tabindex=\"0\" role=\"button\" class=\"aligncenter size-full wp-image-2598\" src=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/display_gpu_info.png?resize=481%2C189&#038;ssl=1\" alt=\"OpenCL info\" width=\"481\" height=\"189\" srcset=\"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/display_gpu_info.png?w=481&amp;ssl=1 481w, https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/display_gpu_info.png?resize=300%2C118&amp;ssl=1 300w\" sizes=\"(max-width: 481px) 100vw, 481px\" data-recalc-dims=\"1\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ogni classe gpu_platform individua e gestisce una delle piattaforme OpenCL la cui list pu\u00f2 essere ottenuta usando la funzione\u00a0 clGetPlatformIDs. Le istanza della classe sono in numero pari alle piattaforme hardware presenti, ed una delle specifiche piattaforme \u00e8 ottenibile come descritto nel&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2654,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"aside","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],"tags":[],"jetpack_publicize_connections":[],"acf":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.colorwave.it\/blog\/wp-content\/uploads\/2017\/12\/gpu_01.jpg?fit=800%2C150&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-FI","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2586"}],"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=2586"}],"version-history":[{"count":12,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2586\/revisions"}],"predecessor-version":[{"id":2607,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2586\/revisions\/2607"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media\/2654"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=2586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=2586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=2586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}