{"id":2608,"date":"2017-10-10T10:22:13","date_gmt":"2017-10-10T10:22:13","guid":{"rendered":"http:\/\/www.colorwave.it\/blog\/?p=2608"},"modified":"2017-12-28T23:25:11","modified_gmt":"2017-12-28T23:25:11","slug":"gpu_device","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/gpu_device\/admin\/2017\/10\/","title":{"rendered":"gpu_device"},"content":{"rendered":"<p><a href=\"https:\/\/www.colorwave.it\/blog\/?p=2586\">In un post precedente\u00a0 \u00e8 stata descritta\u00a0 la classe gpu_platform<\/a>, interfaccia c++ verso le platform\u00a0 OpenCL; la gpu_platform incapsula un insieme di istanze della classe gpu_device, ciascuna interfaccia di uno dei device OpenCL presenti.<\/p>\n<p>Tutti i device appartenenti alla stessa piattaforma condividono lo stesso context, e possono utilizzare gli stessi oggetti di memoria (<a href=\"https:\/\/www.colorwave.it\/blog\/?p=2571\">gpu_buffer<\/a>, gpu_image e classi derivate, come la gpu_screener, gpu_vector ecc).<\/p>\n<pre class=\"lang:default decode:true\">class AFX_EXT_CLASS gpu_device\r\n{\r\npublic:\r\n\tgpu_device ( );\r\n\t~gpu_device ( );\r\n\r\n\t\/** \\brief  rimanda l'id opencl del device\r\n\t*\/\r\n\tcl_device_id Get_id( );\r\n\r\n\t\/** \\brief rimanda la piattaforma di appartenenza del device\r\n\t*\/\r\n\tgpu_platform *Platform ( );\r\n\r\n\tbool gpu_device::Set_platform ( gpu_platform *platform, int progr );\r\n\r\n\t\/** \\brief rimanda la classe work-group del device\r\n\t*\/\r\n\tgpu_work_group *WorkGroup ( );\r\n\r\n\t\/** \\brief rimanda la coda dei comandi del device\r\n\t*\/\r\n\tgpu_command_queue *Queue ( );\r\n\r\n\t\/**  \\brief genera un programma estraendo dal database dei sorgenti precaricati\r\n\t\\details\r\n\t\tLa funzione compila il sorgente di nome program_name presente nella lista gestita dalla classe gpu_programs_db e lo rende disponibile per tutte le chiamate successive;\r\n\t\tIl programma compilato \u00e8 memorizzato nel database e reso disponibile anche per tutte le chiamate successive, fino alla chiusura del framework opencl\r\n\t*\/\r\n\tclass gpu_program *Get_program ( STRING program_name);\r\n\r\n\t\/** \\brief verifica la compatibilita sharing con openGL\r\n\t*\/\r\n\tbool Is_OpenGL_Sharing_Supported ( );\r\n\r\n\t\/** \\brief nome del device\r\n\t*\/\r\n\tchar *Name ( );\r\n\r\n\tvoid Set_id( cl_device_id id );\r\n\r\n\t\/** \\brief rimanda il puntatore alla struttura device_caps del device\r\n\t*\/\r\n\tdevice_caps *Get_device_caps();\r\n\r\n\t__use_private_struct\r\n};\r\n<\/pre>\n<p>Come le istanze valide delle\u00a0 \u00a0classi <a href=\"https:\/\/www.colorwave.it\/blog\/?p=2586\">gpu_platform<\/a> e gpu_context, anche quelle di gpu_device sono definite in fase di inizializzazione del namespace OPCL; Le istanze sono ottenibili attraverso la classe GPU. Di seguito \u00e8 riportato un esempio di codice per ottenere l&#8217;istanza di un particolare device:<\/p>\n<pre class=\"lang:default decode:true\" title=\"estrarre un gpu_device da OPCL\">using namespace OPCL\r\n.....\r\n\r\nif (GPU::Open())\r\n{\r\n\tif (GPU::NumPlatForms())\r\n\t{\r\n\t\tgpu_platform *platform = GPU::Platform(0);\r\n\t\tif (platform-&gt;NumDevices())\r\n\t\t{\r\n\t\t\tgpu_device *device= platform-&gt;Device(0)\r\n\t\t}\r\n\t\t.......................\r\n\t}\r\n\t............\r\n}\r\n<\/pre>\n<h4>Il device di default<\/h4>\n<p>Se non \u00e8 necessario utilizzare pi\u00f9 device, \u00e8 sufficiente ricorrere alla funzione\u00a0 GPU::GetDefaultDevice ( ) per ottenere un gpu_device valido;\u00a0 la funzione effettua automaticamente tutte le inizializzazioni\u00a0preliminari e rimanda il device di default sulla piattaforma di default;<\/p>\n<p>Le funzioni e metodi di questa classe sono usate internamente dalle altre classi del namespace OPCL, e difficilmente saranno utilizzate direttamente nella progettazione dei programmi che fanno uso di OpenCL; pertanto questa breve esposizione non propone la spiegazione delle funzioni, ma solo una informazione preliminare che sar\u00e0 ripresa in prossimi articoli, nei quali si esporranno esempi di codice OpenCL e le relative interfacce c++ verso le GPU;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In un post precedente\u00a0 \u00e8 stata descritta\u00a0 la classe gpu_platform, interfaccia c++ verso le platform\u00a0 OpenCL; la gpu_platform incapsula un insieme di istanze della classe gpu_device, ciascuna interfaccia di uno dei device OpenCL presenti. Tutti i device appartenenti alla stessa piattaforma condividono&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2615,"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\/lumache_mdf.png?fit=700%2C214&ssl=1","jetpack_sharing_enabled":false,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-G4","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2608"}],"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=2608"}],"version-history":[{"count":12,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2608\/revisions"}],"predecessor-version":[{"id":2634,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/2608\/revisions\/2634"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media\/2615"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=2608"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=2608"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=2608"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}