{"id":626,"date":"2017-12-06T08:54:29","date_gmt":"2017-12-06T08:54:29","guid":{"rendered":"http:\/\/www.colorwave.it\/blog\/?p=626"},"modified":"2018-01-25T16:51:48","modified_gmt":"2018-01-25T16:51:48","slug":"terminologia-opencl","status":"publish","type":"post","link":"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/terminologia-opencl\/admin\/2017\/12\/","title":{"rendered":"Terminologia OpenCL"},"content":{"rendered":"<h2>Documentazione di riferimento<\/h2>\n<p>Questo articolo definisce la terminologia La terminologia riportata in questo articolo fa riferimento ai concetti sottesi alle API Colibri::OPCL , derivati dagli standard\u00a0 OpenCL. Di seguito sono riportati alcuni siti di riferimento per l&#8217;ambiente OpenCL;<\/p>\n<p><a href=\"https:\/\/www.khronos.org\/registry\/OpenCL\/sdk\/1.2\/docs\/man\/xhtml\/\">OpenCL 1.2 reference pages<\/a><\/p>\n<p><a href=\"https:\/\/www.khronos.org\/registry\/OpenCL\/sdk\/1.2\/docs\/man\/xhtml\/\">OpenCL 2.0 reference pages<\/a><\/p>\n<p>inoltre <span style=\"color: #800000;\"><em><a style=\"color: #800000;\" href=\"https:\/\/www.colorwave.it\/blog\/heterogeneus-computing\/siti-opencl-interessanti\/admin\/2017\/12\/\" target=\"_blank\" rel=\"noopener\">questo articolo del blog<\/a><\/em> <\/span>contiene una lista di link a siti di riferimento per la documentazione OpenCL;<\/p>\n<p>Documentazione\u00a0 di riferimento del linguaggio OpenCL dispoibile sul sito Kronos.org; da qui si possono accedere tutte le informazioni relative al linguaggio lato GPU e CPU rev 1.2 e 2.0.<\/p>\n<h2>compute kernel<\/h2>\n<p style=\"text-align: left;\">Un kernel \u00e8 una piccola unit\u00e0 di esecuzione che esegue una funzione chiaramente definita e che pu\u00f2 essere eseguita in parallelo. Un kernel pu\u00f2 essere eseguito su ogni elemento di un flusso di input (chiamato NDRange) o semplicemente su ciascun punto in uno spazio indice arbitrario. Un kernel \u00e8 analogo e, su alcuni dispositivi identico, a ci\u00f2 che i programmatori grafici chiamano un programma shader. Questo kernel non deve essere confuso con un kernel del sistema operativo, che controlla l&#8217;hardware. La forma pi\u00f9 semplice di un NDRange viene semplicemente mappata sui dati di input e produce un elemento di output per ogni ennupla di input.<\/p>\n<p style=\"text-align: left;\">Le estensioni successive del modello base forniscono funzionalit\u00e0 di accesso casuale, conteggi delle uscite variabili e operazioni di riduzione \/ accumulo.<\/p>\n<p style=\"text-align: left;\">In openCL i kernel vengono specificati usando la parola chiave __<em>kernel<\/em>.<\/p>\n<p style=\"text-align: left;\">Un kernel di calcolo \u00e8 un tipo specifico di kernel che non fa parte della tradizionale pipeline grafica. Il tipo di kernel di calcolo pu\u00f2 essere utilizzato per la grafica, ma la sua forza risiede nell&#8217;utilizzarlo per campi non grafici come fisica, intelligenza artificiale, modellazione, HPC e varie altre applicazioni ad alta intensit\u00e0 di calcolo.<\/p>\n<p style=\"text-align: left;\">In un kernel di calcolo, l&#8217;ordine di spawn dei work-item\u00a0 \u00e8 sequenziale:\u00a0 ci\u00f2 significa che su un chip con N work-item per frontwave, i primi N <span style=\"display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;\">work-item<\/span> sono trattati dal wavefront 1, i secondi N work-item sono eseguiti dal wavefront 2, ecc.<\/p>\n<p style=\"text-align: left;\">Quindi, gli ID dei work-item assegnati al wavefront K-esimo sono quelli nell&#8217;intervallo<\/p>\n<p style=\"text-align: center;\">\u00a0da (K \u2022 N) a ((K + 1) \u2022 N) &#8211; 1<\/p>\n<h2 data-canvas-width=\"109.73664000000001\">wavefronts e work-group<\/h2>\n<p>Wavefronts e work-group sono due concetti relativi ai kernel di elaborazione che permettono una granularit\u00e0 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Data_parallelism\">data-parallel.<\/a><\/p>\n<p>Un <span style=\"display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;\">Wavefront<\/span> esegue un insieme di work-item in lock-step ciascuno rispetto agli altri.<\/p>\n<p>Ad esempio, sedici elementi di lavoro sono eseguiti in parallelo attraverso l&#8217;unit\u00e0 vettoriale e l&#8217;intero wavefront\u00a0 \u00e8 eseguito in quattro cicli di clock.<\/p>\n<p>Ci\u00f2 significa che se due work-item del <span style=\"display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;\">wavefront\u00a0 seguono <\/span>percorsi divergenti nel flusso di esecuzione, tutti i work-item del wavefront fanno lo stesso percorso.<\/p>\n<p>Il raggruppamento dei work-item in work-group \u00e8 invece una granularit\u00e0 di livello superiore del parallelismo dei dati che viene gestita via software, non hardware.<\/p>\n<p>I punti di sincronizzazione definiti\u00a0 in un kernel garantiscono che tutti i work-item in un work-group raggiungano quel punto (barriera) nel codice prima dell&#8217;esecuzione dell&#8217;istruzione successiva. I work-group sono organizzati in <span style=\"display: inline !important; float: none; background-color: transparent; color: #333333; cursor: text; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;\">wavefront , e le<\/span> migliori prestazioni si ottengono quando la dimensione del work-group \u00e8 un multiplo intero della dimensione del wavefront.<\/p>\n<h2 data-canvas-width=\"109.55568000000001\">Local data store\u00a0(LDS)<\/h2>\n<p>La LDS \u00e8 una memoria ad alta velocit\u00e0 e bassa latenza,\u00a0 privata per ogni unit\u00e0 di elaborazione.<\/p>\n<p>Un work-group pu\u00f2 scrivere ovunque nel suo spazio assegnato.<\/p>\n<p>Questo modello \u00e8 rimasto invariato per la serie AMD Radeon &#x2122; HD 7XXX. I vincoli dell&#8217;attuale modello LDS sono:<\/p>\n<ul>\n<li><em>La dimensione LDS \u00e8 allocata per work-group.\u00a0 Ogni <span style=\"text-align: left; color: #333333; text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-variant: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; display: inline !important; white-space: normal; cursor: text; orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: transparent;\"> work-group<\/span> specifica la quantit\u00e0 di LDS richiesta. Lo scheduler hardware utilizza queste informazioni per determinare quali <span style=\"text-align: left; color: #333333; text-transform: none; text-indent: 0px; letter-spacing: normal; font-family: Georgia,'Times New Roman','Bitstream Charter',Times,serif; font-size: 16px; font-variant: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; display: inline !important; white-space: normal; cursor: text; orphans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: transparent;\"> work-group<\/span> possono condividere un&#8217;unit\u00e0 di calcolo <\/em><\/li>\n<li><em>I dati possono essere condivisi solo all&#8217;interno dei work-item del work-group di appartenenza. <\/em><\/li>\n<li><em>Gli accessi alla memoria al di fuori del work-group producono un comportamento indefinito.<\/em><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Documentazione di riferimento Questo articolo definisce la terminologia La terminologia riportata in questo articolo fa riferimento ai concetti sottesi alle API Colibri::OPCL , derivati dagli standard\u00a0 OpenCL. Di seguito sono riportati alcuni siti di riferimento per l&#8217;ambiente OpenCL; OpenCL 1.2 reference pages&#8230;<\/p>\n","protected":false},"author":1,"featured_media":2521,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","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\/opencl_01.png?fit=304%2C204&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9rwsf-a6","jetpack_likes_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/626"}],"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=626"}],"version-history":[{"count":15,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/626\/revisions"}],"predecessor-version":[{"id":2853,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/posts\/626\/revisions\/2853"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media\/2521"}],"wp:attachment":[{"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/media?parent=626"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/categories?post=626"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.colorwave.it\/blog\/wp-json\/wp\/v2\/tags?post=626"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}