| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]--> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <meta name="generator" content="Asciidoctor 1.5.8"> |
| <meta name="author" content="Khronos® OpenCL Working Group"> |
| <title>The OpenCL™ Specification</title> |
| <style> |
| /*! normalize.css v2.1.2 | MIT License | git.io/normalize */ |
| /* ========================================================================== HTML5 display definitions ========================================================================== */ |
| /** Correct `block` display not defined in IE 8/9. */ |
| article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } |
| |
| /** Correct `inline-block` display not defined in IE 8/9. */ |
| audio, canvas, video { display: inline-block; } |
| |
| /** Prevent modern browsers from displaying `audio` without controls. Remove excess height in iOS 5 devices. */ |
| audio:not([controls]) { display: none; height: 0; } |
| |
| /** Address `[hidden]` styling not present in IE 8/9. Hide the `template` element in IE, Safari, and Firefox < 22. */ |
| [hidden], template { display: none; } |
| |
| script { display: none !important; } |
| |
| /* ========================================================================== Base ========================================================================== */ |
| /** 1. Set default font family to sans-serif. 2. Prevent iOS text size adjust after orientation change, without disabling user zoom. */ |
| html { font-family: sans-serif; /* 1 */ -ms-text-size-adjust: 100%; /* 2 */ -webkit-text-size-adjust: 100%; /* 2 */ } |
| |
| /** Remove default margin. */ |
| body { margin: 0; } |
| |
| /* ========================================================================== Links ========================================================================== */ |
| /** Remove the gray background color from active links in IE 10. */ |
| a { background: transparent; } |
| |
| /** Address `outline` inconsistency between Chrome and other browsers. */ |
| a:focus { outline: thin dotted; } |
| |
| /** Improve readability when focused and also mouse hovered in all browsers. */ |
| a:active, a:hover { outline: 0; } |
| |
| /* ========================================================================== Typography ========================================================================== */ |
| /** Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. */ |
| h1 { font-size: 2em; margin: 0.67em 0; } |
| |
| /** Address styling not present in IE 8/9, Safari 5, and Chrome. */ |
| abbr[title] { border-bottom: 1px dotted; } |
| |
| /** Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. */ |
| b, strong { font-weight: bold; } |
| |
| /** Address styling not present in Safari 5 and Chrome. */ |
| dfn { font-style: italic; } |
| |
| /** Address differences between Firefox and other browsers. */ |
| hr { -moz-box-sizing: content-box; box-sizing: content-box; height: 0; } |
| |
| /** Address styling not present in IE 8/9. */ |
| mark { background: #ff0; color: #000; } |
| |
| /** Correct font family set oddly in Safari 5 and Chrome. */ |
| code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } |
| |
| /** Improve readability of pre-formatted text in all browsers. */ |
| pre { white-space: pre-wrap; } |
| |
| /** Set consistent quote types. */ |
| q { quotes: "\201C" "\201D" "\2018" "\2019"; } |
| |
| /** Address inconsistent and variable font size in all browsers. */ |
| small { font-size: 80%; } |
| |
| /** Prevent `sub` and `sup` affecting `line-height` in all browsers. */ |
| sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } |
| |
| sup { top: -0.5em; } |
| |
| sub { bottom: -0.25em; } |
| |
| /* ========================================================================== Embedded content ========================================================================== */ |
| /** Remove border when inside `a` element in IE 8/9. */ |
| img { border: 0; } |
| |
| /** Correct overflow displayed oddly in IE 9. */ |
| svg:not(:root) { overflow: hidden; } |
| |
| /* ========================================================================== Figures ========================================================================== */ |
| /** Address margin not present in IE 8/9 and Safari 5. */ |
| figure { margin: 0; } |
| |
| /* ========================================================================== Forms ========================================================================== */ |
| /** Define consistent border, margin, and padding. */ |
| fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } |
| |
| /** 1. Correct `color` not being inherited in IE 8/9. 2. Remove padding so people aren't caught out if they zero out fieldsets. */ |
| legend { border: 0; /* 1 */ padding: 0; /* 2 */ } |
| |
| /** 1. Correct font family not being inherited in all browsers. 2. Correct font size not being inherited in all browsers. 3. Address margins set differently in Firefox 4+, Safari 5, and Chrome. */ |
| button, input, select, textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 2 */ margin: 0; /* 3 */ } |
| |
| /** Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. */ |
| button, input { line-height: normal; } |
| |
| /** Address inconsistent `text-transform` inheritance for `button` and `select`. All other form control elements do not inherit `text-transform` values. Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. Correct `select` style inheritance in Firefox 4+ and Opera. */ |
| button, select { text-transform: none; } |
| |
| /** 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls. 2. Correct inability to style clickable `input` types in iOS. 3. Improve usability and consistency of cursor style between image-type `input` and others. */ |
| button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; /* 2 */ cursor: pointer; /* 3 */ } |
| |
| /** Re-set default cursor for disabled elements. */ |
| button[disabled], html input[disabled] { cursor: default; } |
| |
| /** 1. Address box sizing set to `content-box` in IE 8/9. 2. Remove excess padding in IE 8/9. */ |
| input[type="checkbox"], input[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ } |
| |
| /** 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). */ |
| input[type="search"] { -webkit-appearance: textfield; /* 1 */ -moz-box-sizing: content-box; -webkit-box-sizing: content-box; /* 2 */ box-sizing: content-box; } |
| |
| /** Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. */ |
| input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } |
| |
| /** Remove inner padding and border in Firefox 4+. */ |
| button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } |
| |
| /** 1. Remove default vertical scrollbar in IE 8/9. 2. Improve readability and alignment in all browsers. */ |
| textarea { overflow: auto; /* 1 */ vertical-align: top; /* 2 */ } |
| |
| /* ========================================================================== Tables ========================================================================== */ |
| /** Remove most spacing between table cells. */ |
| table { border-collapse: collapse; border-spacing: 0; } |
| |
| meta.foundation-mq-small { font-family: "only screen and (min-width: 768px)"; width: 768px; } |
| |
| meta.foundation-mq-medium { font-family: "only screen and (min-width:1280px)"; width: 1280px; } |
| |
| meta.foundation-mq-large { font-family: "only screen and (min-width:1440px)"; width: 1440px; } |
| |
| *, *:before, *:after { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } |
| |
| html, body { font-size: 100%; } |
| |
| body { background: white; color: #222222; padding: 0; margin: 0; font-family: "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; font-weight: normal; font-style: normal; line-height: 1; position: relative; cursor: auto; } |
| |
| a:hover { cursor: pointer; } |
| |
| img, object, embed { max-width: 100%; height: auto; } |
| |
| object, embed { height: 100%; } |
| |
| img { -ms-interpolation-mode: bicubic; } |
| |
| #map_canvas img, #map_canvas embed, #map_canvas object, .map_canvas img, .map_canvas embed, .map_canvas object { max-width: none !important; } |
| |
| .left { float: left !important; } |
| |
| .right { float: right !important; } |
| |
| .text-left { text-align: left !important; } |
| |
| .text-right { text-align: right !important; } |
| |
| .text-center { text-align: center !important; } |
| |
| .text-justify { text-align: justify !important; } |
| |
| .hide { display: none; } |
| |
| .antialiased { -webkit-font-smoothing: antialiased; } |
| |
| img { display: inline-block; vertical-align: middle; } |
| |
| textarea { height: auto; min-height: 50px; } |
| |
| select { width: 100%; } |
| |
| object, svg { display: inline-block; vertical-align: middle; } |
| |
| .center { margin-left: auto; margin-right: auto; } |
| |
| .spread { width: 100%; } |
| |
| p.lead, .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { font-size: 1.21875em; line-height: 1.6; } |
| |
| .subheader, .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { line-height: 1.4; color: black; font-weight: 300; margin-top: 0.2em; margin-bottom: 0.5em; } |
| |
| /* Typography resets */ |
| div, dl, dt, dd, ul, ol, li, h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6, pre, form, p, blockquote, th, td { margin: 0; padding: 0; direction: ltr; } |
| |
| /* Default Link Styles */ |
| a { color: #0068b0; text-decoration: none; line-height: inherit; } |
| a:hover, a:focus { color: #333333; } |
| a img { border: none; } |
| |
| /* Default paragraph styles */ |
| p { font-family: Noto, sans-serif; font-weight: normal; font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; text-rendering: optimizeLegibility; } |
| p aside { font-size: 0.875em; line-height: 1.35; font-style: italic; } |
| |
| /* Default header styles */ |
| h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { font-family: Noto, sans-serif; font-weight: normal; font-style: normal; color: black; text-rendering: optimizeLegibility; margin-top: 0.5em; margin-bottom: 0.5em; line-height: 1.2125em; } |
| h1 small, h2 small, h3 small, #toctitle small, .sidebarblock > .content > .title small, h4 small, h5 small, h6 small { font-size: 60%; color: #4d4d4d; line-height: 0; } |
| |
| h1 { font-size: 2.125em; } |
| |
| h2 { font-size: 1.6875em; } |
| |
| h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.375em; } |
| |
| h4 { font-size: 1.125em; } |
| |
| h5 { font-size: 1.125em; } |
| |
| h6 { font-size: 1em; } |
| |
| hr { border: solid #dddddd; border-width: 1px 0 0; clear: both; margin: 1.25em 0 1.1875em; height: 0; } |
| |
| /* Helpful Typography Defaults */ |
| em, i { font-style: italic; line-height: inherit; } |
| |
| strong, b { font-weight: bold; line-height: inherit; } |
| |
| small { font-size: 60%; line-height: inherit; } |
| |
| code { font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; color: #264357; } |
| |
| /* Lists */ |
| ul, ol, dl { font-size: 1em; line-height: 1.6; margin-bottom: 0.75em; list-style-position: outside; font-family: Noto, sans-serif; } |
| |
| ul, ol { margin-left: 1.5em; } |
| ul.no-bullet, ol.no-bullet { margin-left: 1.5em; } |
| |
| /* Unordered Lists */ |
| ul li ul, ul li ol { margin-left: 1.25em; margin-bottom: 0; font-size: 1em; /* Override nested font-size change */ } |
| ul.square li ul, ul.circle li ul, ul.disc li ul { list-style: inherit; } |
| ul.square { list-style-type: square; } |
| ul.circle { list-style-type: circle; } |
| ul.disc { list-style-type: disc; } |
| ul.no-bullet { list-style: none; } |
| |
| /* Ordered Lists */ |
| ol li ul, ol li ol { margin-left: 1.25em; margin-bottom: 0; } |
| |
| /* Definition Lists */ |
| dl dt { margin-bottom: 0.3em; font-weight: bold; } |
| dl dd { margin-bottom: 0.75em; } |
| |
| /* Abbreviations */ |
| abbr, acronym { text-transform: uppercase; font-size: 90%; color: black; border-bottom: 1px dotted #dddddd; cursor: help; } |
| |
| abbr { text-transform: none; } |
| |
| /* Blockquotes */ |
| blockquote { margin: 0 0 0.75em; padding: 0.5625em 1.25em 0 1.1875em; border-left: 1px solid #dddddd; } |
| blockquote cite { display: block; font-size: 0.8125em; color: #5e93b8; } |
| blockquote cite:before { content: "\2014 \0020"; } |
| blockquote cite a, blockquote cite a:visited { color: #5e93b8; } |
| |
| blockquote, blockquote p { line-height: 1.6; color: #333333; } |
| |
| /* Microformats */ |
| .vcard { display: inline-block; margin: 0 0 1.25em 0; border: 1px solid #dddddd; padding: 0.625em 0.75em; } |
| .vcard li { margin: 0; display: block; } |
| .vcard .fn { font-weight: bold; font-size: 0.9375em; } |
| |
| .vevent .summary { font-weight: bold; } |
| .vevent abbr { cursor: auto; text-decoration: none; font-weight: bold; border: none; padding: 0 0.0625em; } |
| |
| @media only screen and (min-width: 768px) { h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; } |
| h1 { font-size: 2.75em; } |
| h2 { font-size: 2.3125em; } |
| h3, #toctitle, .sidebarblock > .content > .title { font-size: 1.6875em; } |
| h4 { font-size: 1.4375em; } } |
| /* Tables */ |
| table { background: white; margin-bottom: 1.25em; border: solid 1px #d8d8ce; } |
| table thead, table tfoot { background: -webkit-linear-gradient(top, #add386, #90b66a); font-weight: bold; } |
| table thead tr th, table thead tr td, table tfoot tr th, table tfoot tr td { padding: 0.5em 0.625em 0.625em; font-size: inherit; color: white; text-align: left; } |
| table tr th, table tr td { padding: 0.5625em 0.625em; font-size: inherit; color: #6d6e71; } |
| table tr.even, table tr.alt, table tr:nth-of-type(even) { background: #edf2f2; } |
| table thead tr th, table tfoot tr th, table tbody tr td, table tr td, table tfoot tr td { display: table-cell; line-height: 1.4; } |
| |
| body { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; tab-size: 4; } |
| |
| h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { line-height: 1.4; } |
| |
| a:hover, a:focus { text-decoration: underline; } |
| |
| .clearfix:before, .clearfix:after, .float-group:before, .float-group:after { content: " "; display: table; } |
| .clearfix:after, .float-group:after { clear: both; } |
| |
| *:not(pre) > code { font-size: inherit; font-style: normal !important; letter-spacing: 0; padding: 0; background-color: white; -webkit-border-radius: 0; border-radius: 0; line-height: inherit; word-wrap: break-word; } |
| *:not(pre) > code.nobreak { word-wrap: normal; } |
| *:not(pre) > code.nowrap { white-space: nowrap; } |
| |
| pre, pre > code { line-height: 1.6; color: #264357; font-family: Consolas, "Liberation Mono", Courier, monospace; font-weight: normal; } |
| |
| em em { font-style: normal; } |
| |
| strong strong { font-weight: normal; } |
| |
| .keyseq { color: #333333; } |
| |
| kbd { font-family: Consolas, "Liberation Mono", Courier, monospace; display: inline-block; color: black; font-size: 0.65em; line-height: 1.45; background-color: #f7f7f7; border: 1px solid #ccc; -webkit-border-radius: 3px; border-radius: 3px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2), 0 0 0 0.1em white inset; margin: 0 0.15em; padding: 0.2em 0.5em; vertical-align: middle; position: relative; top: -0.1em; white-space: nowrap; } |
| |
| .keyseq kbd:first-child { margin-left: 0; } |
| |
| .keyseq kbd:last-child { margin-right: 0; } |
| |
| .menuseq, .menuref { color: #000; } |
| |
| .menuseq b:not(.caret), .menuref { font-weight: inherit; } |
| |
| .menuseq { word-spacing: -0.02em; } |
| .menuseq b.caret { font-size: 1.25em; line-height: 0.8; } |
| .menuseq i.caret { font-weight: bold; text-align: center; width: 0.45em; } |
| |
| b.button:before, b.button:after { position: relative; top: -1px; font-weight: normal; } |
| |
| b.button:before { content: "["; padding: 0 3px 0 2px; } |
| |
| b.button:after { content: "]"; padding: 0 2px 0 3px; } |
| |
| #header, #content, #footnotes, #footer { width: 100%; margin-left: auto; margin-right: auto; margin-top: 0; margin-bottom: 0; max-width: 62.5em; *zoom: 1; position: relative; padding-left: 1.5em; padding-right: 1.5em; } |
| #header:before, #header:after, #content:before, #content:after, #footnotes:before, #footnotes:after, #footer:before, #footer:after { content: " "; display: table; } |
| #header:after, #content:after, #footnotes:after, #footer:after { clear: both; } |
| |
| #content { margin-top: 1.25em; } |
| |
| #content:before { content: none; } |
| |
| #header > h1:first-child { color: black; margin-top: 2.25rem; margin-bottom: 0; } |
| #header > h1:first-child + #toc { margin-top: 8px; border-top: 1px solid #dddddd; } |
| #header > h1:only-child, body.toc2 #header > h1:nth-last-child(2) { border-bottom: 1px solid #dddddd; padding-bottom: 8px; } |
| #header .details { border-bottom: 1px solid #dddddd; line-height: 1.45; padding-top: 0.25em; padding-bottom: 0.25em; padding-left: 0.25em; color: #5e93b8; display: -ms-flexbox; display: -webkit-flex; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; } |
| #header .details span:first-child { margin-left: -0.125em; } |
| #header .details span.email a { color: #333333; } |
| #header .details br { display: none; } |
| #header .details br + span:before { content: "\00a0\2013\00a0"; } |
| #header .details br + span.author:before { content: "\00a0\22c5\00a0"; color: #333333; } |
| #header .details br + span#revremark:before { content: "\00a0|\00a0"; } |
| #header #revnumber { text-transform: capitalize; } |
| #header #revnumber:after { content: "\00a0"; } |
| |
| #content > h1:first-child:not([class]) { color: black; border-bottom: 1px solid #dddddd; padding-bottom: 8px; margin-top: 0; padding-top: 1rem; margin-bottom: 1.25rem; } |
| |
| #toc { border-bottom: 0 solid #dddddd; padding-bottom: 0.5em; } |
| #toc > ul { margin-left: 0.125em; } |
| #toc ul.sectlevel0 > li > a { font-style: italic; } |
| #toc ul.sectlevel0 ul.sectlevel1 { margin: 0.5em 0; } |
| #toc ul { font-family: Noto, sans-serif; list-style-type: none; } |
| #toc li { line-height: 1.3334; margin-top: 0.3334em; } |
| #toc a { text-decoration: none; } |
| #toc a:active { text-decoration: underline; } |
| |
| #toctitle { color: black; font-size: 1.2em; } |
| |
| @media only screen and (min-width: 768px) { #toctitle { font-size: 1.375em; } |
| body.toc2 { padding-left: 15em; padding-right: 0; } |
| #toc.toc2 { margin-top: 0 !important; background-color: white; position: fixed; width: 15em; left: 0; top: 0; border-right: 1px solid #dddddd; border-top-width: 0 !important; border-bottom-width: 0 !important; z-index: 1000; padding: 1.25em 1em; height: 100%; overflow: auto; } |
| #toc.toc2 #toctitle { margin-top: 0; margin-bottom: 0.8rem; font-size: 1.2em; } |
| #toc.toc2 > ul { font-size: 0.9em; margin-bottom: 0; } |
| #toc.toc2 ul ul { margin-left: 0; padding-left: 1em; } |
| #toc.toc2 ul.sectlevel0 ul.sectlevel1 { padding-left: 0; margin-top: 0.5em; margin-bottom: 0.5em; } |
| body.toc2.toc-right { padding-left: 0; padding-right: 15em; } |
| body.toc2.toc-right #toc.toc2 { border-right-width: 0; border-left: 1px solid #dddddd; left: auto; right: 0; } } |
| @media only screen and (min-width: 1280px) { body.toc2 { padding-left: 20em; padding-right: 0; } |
| #toc.toc2 { width: 20em; } |
| #toc.toc2 #toctitle { font-size: 1.375em; } |
| #toc.toc2 > ul { font-size: 0.95em; } |
| #toc.toc2 ul ul { padding-left: 1.25em; } |
| body.toc2.toc-right { padding-left: 0; padding-right: 20em; } } |
| #content #toc { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; } |
| #content #toc > :first-child { margin-top: 0; } |
| #content #toc > :last-child { margin-bottom: 0; } |
| |
| #footer { max-width: 100%; background-color: none; padding: 1.25em; } |
| |
| #footer-text { color: black; line-height: 1.44; } |
| |
| #content { margin-bottom: 0.625em; } |
| |
| .sect1 { padding-bottom: 0.625em; } |
| |
| @media only screen and (min-width: 768px) { #content { margin-bottom: 1.25em; } |
| .sect1 { padding-bottom: 1.25em; } } |
| .sect1:last-child { padding-bottom: 0; } |
| |
| .sect1 + .sect1 { border-top: 0 solid #dddddd; } |
| |
| #content h1 > a.anchor, h2 > a.anchor, h3 > a.anchor, #toctitle > a.anchor, .sidebarblock > .content > .title > a.anchor, h4 > a.anchor, h5 > a.anchor, h6 > a.anchor { position: absolute; z-index: 1001; width: 1.5ex; margin-left: -1.5ex; display: block; text-decoration: none !important; visibility: hidden; text-align: center; font-weight: normal; } |
| #content h1 > a.anchor:before, h2 > a.anchor:before, h3 > a.anchor:before, #toctitle > a.anchor:before, .sidebarblock > .content > .title > a.anchor:before, h4 > a.anchor:before, h5 > a.anchor:before, h6 > a.anchor:before { content: "\00A7"; font-size: 0.85em; display: block; padding-top: 0.1em; } |
| #content h1:hover > a.anchor, #content h1 > a.anchor:hover, h2:hover > a.anchor, h2 > a.anchor:hover, h3:hover > a.anchor, #toctitle:hover > a.anchor, .sidebarblock > .content > .title:hover > a.anchor, h3 > a.anchor:hover, #toctitle > a.anchor:hover, .sidebarblock > .content > .title > a.anchor:hover, h4:hover > a.anchor, h4 > a.anchor:hover, h5:hover > a.anchor, h5 > a.anchor:hover, h6:hover > a.anchor, h6 > a.anchor:hover { visibility: visible; } |
| #content h1 > a.link, h2 > a.link, h3 > a.link, #toctitle > a.link, .sidebarblock > .content > .title > a.link, h4 > a.link, h5 > a.link, h6 > a.link { color: black; text-decoration: none; } |
| #content h1 > a.link:hover, h2 > a.link:hover, h3 > a.link:hover, #toctitle > a.link:hover, .sidebarblock > .content > .title > a.link:hover, h4 > a.link:hover, h5 > a.link:hover, h6 > a.link:hover { color: black; } |
| |
| .audioblock, .imageblock, .literalblock, .listingblock, .stemblock, .videoblock { margin-bottom: 1.25em; } |
| |
| .admonitionblock td.content > .title, .audioblock > .title, .exampleblock > .title, .imageblock > .title, .listingblock > .title, .literalblock > .title, .stemblock > .title, .openblock > .title, .paragraph > .title, .quoteblock > .title, table.tableblock > .title, .verseblock > .title, .videoblock > .title, .dlist > .title, .olist > .title, .ulist > .title, .qlist > .title, .hdlist > .title { text-rendering: optimizeLegibility; text-align: left; } |
| |
| table.tableblock > caption.title { white-space: nowrap; overflow: visible; max-width: 0; } |
| |
| .paragraph.lead > p, #preamble > .sectionbody > .paragraph:first-of-type p { color: black; } |
| |
| table.tableblock #preamble > .sectionbody > .paragraph:first-of-type p { font-size: inherit; } |
| |
| .admonitionblock > table { border-collapse: separate; border: 0; background: none; width: 100%; } |
| .admonitionblock > table td.icon { text-align: center; width: 80px; } |
| .admonitionblock > table td.icon img { max-width: initial; } |
| .admonitionblock > table td.icon .title { font-weight: bold; font-family: Noto, sans-serif; text-transform: uppercase; } |
| .admonitionblock > table td.content { padding-left: 1.125em; padding-right: 1.25em; border-left: 1px solid #dddddd; color: #5e93b8; } |
| .admonitionblock > table td.content > :last-child > :last-child { margin-bottom: 0; } |
| |
| .exampleblock > .content { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; } |
| .exampleblock > .content > :first-child { margin-top: 0; } |
| .exampleblock > .content > :last-child { margin-bottom: 0; } |
| |
| .sidebarblock { border-style: solid; border-width: 1px; border-color: #e6e6e6; margin-bottom: 1.25em; padding: 1.25em; background: white; -webkit-border-radius: 0; border-radius: 0; } |
| .sidebarblock > :first-child { margin-top: 0; } |
| .sidebarblock > :last-child { margin-bottom: 0; } |
| .sidebarblock > .content > .title { color: black; margin-top: 0; } |
| |
| .exampleblock > .content > :last-child > :last-child, .exampleblock > .content .olist > ol > li:last-child > :last-child, .exampleblock > .content .ulist > ul > li:last-child > :last-child, .exampleblock > .content .qlist > ol > li:last-child > :last-child, .sidebarblock > .content > :last-child > :last-child, .sidebarblock > .content .olist > ol > li:last-child > :last-child, .sidebarblock > .content .ulist > ul > li:last-child > :last-child, .sidebarblock > .content .qlist > ol > li:last-child > :last-child { margin-bottom: 0; } |
| |
| .literalblock pre, .listingblock pre:not(.highlight), .listingblock pre[class="highlight"], .listingblock pre[class^="highlight "], .listingblock pre.CodeRay, .listingblock pre.prettyprint { background: #eeeeee; } |
| .sidebarblock .literalblock pre, .sidebarblock .listingblock pre:not(.highlight), .sidebarblock .listingblock pre[class="highlight"], .sidebarblock .listingblock pre[class^="highlight "], .sidebarblock .listingblock pre.CodeRay, .sidebarblock .listingblock pre.prettyprint { background: #f2f1f1; } |
| |
| .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { border: 1px hidden #666666; -webkit-border-radius: 0; border-radius: 0; word-wrap: break-word; padding: 1.25em 1.5625em 1.125em 1.5625em; font-size: 0.8125em; } |
| .literalblock pre.nowrap, .literalblock pre[class].nowrap, .listingblock pre.nowrap, .listingblock pre[class].nowrap { overflow-x: auto; white-space: pre; word-wrap: normal; } |
| @media only screen and (min-width: 768px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 0.90625em; } } |
| @media only screen and (min-width: 1280px) { .literalblock pre, .literalblock pre[class], .listingblock pre, .listingblock pre[class] { font-size: 1em; } } |
| |
| .literalblock.output pre { color: #eeeeee; background-color: #264357; } |
| |
| .listingblock pre.highlightjs { padding: 0; } |
| .listingblock pre.highlightjs > code { padding: 1.25em 1.5625em 1.125em 1.5625em; -webkit-border-radius: 0; border-radius: 0; } |
| |
| .listingblock > .content { position: relative; } |
| |
| .listingblock code[data-lang]:before { display: none; content: attr(data-lang); position: absolute; font-size: 0.75em; top: 0.425rem; right: 0.5rem; line-height: 1; text-transform: uppercase; color: #999; } |
| |
| .listingblock:hover code[data-lang]:before { display: block; } |
| |
| .listingblock.terminal pre .command:before { content: attr(data-prompt); padding-right: 0.5em; color: #999; } |
| |
| .listingblock.terminal pre .command:not([data-prompt]):before { content: "$"; } |
| |
| table.pyhltable { border-collapse: separate; border: 0; margin-bottom: 0; background: none; } |
| |
| table.pyhltable td { vertical-align: top; padding-top: 0; padding-bottom: 0; line-height: 1.6; } |
| |
| table.pyhltable td.code { padding-left: .75em; padding-right: 0; } |
| |
| pre.pygments .lineno, table.pyhltable td:not(.code) { color: #999; padding-left: 0; padding-right: .5em; border-right: 1px solid #dddddd; } |
| |
| pre.pygments .lineno { display: inline-block; margin-right: .25em; } |
| |
| table.pyhltable .linenodiv { background: none !important; padding-right: 0 !important; } |
| |
| .quoteblock { margin: 0 1em 0.75em 1.5em; display: table; } |
| .quoteblock > .title { margin-left: -1.5em; margin-bottom: 0.75em; } |
| .quoteblock blockquote, .quoteblock blockquote p { color: #333333; font-size: 1.15rem; line-height: 1.75; word-spacing: 0.1em; letter-spacing: 0; font-style: italic; text-align: justify; } |
| .quoteblock blockquote { margin: 0; padding: 0; border: 0; } |
| .quoteblock blockquote:before { content: "\201c"; float: left; font-size: 2.75em; font-weight: bold; line-height: 0.6em; margin-left: -0.6em; color: black; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); } |
| .quoteblock blockquote > .paragraph:last-child p { margin-bottom: 0; } |
| .quoteblock .attribution { margin-top: 0.5em; margin-right: 0.5ex; text-align: right; } |
| .quoteblock .quoteblock { margin-left: 0; margin-right: 0; padding: 0.5em 0; border-left: 3px solid #5e93b8; } |
| .quoteblock .quoteblock blockquote { padding: 0 0 0 0.75em; } |
| .quoteblock .quoteblock blockquote:before { display: none; } |
| |
| .verseblock { margin: 0 1em 0.75em 1em; } |
| .verseblock pre { font-family: "Open Sans", "DejaVu Sans", sans; font-size: 1.15rem; color: #333333; font-weight: 300; text-rendering: optimizeLegibility; } |
| .verseblock pre strong { font-weight: 400; } |
| .verseblock .attribution { margin-top: 1.25rem; margin-left: 0.5ex; } |
| |
| .quoteblock .attribution, .verseblock .attribution { font-size: 0.8125em; line-height: 1.45; font-style: italic; } |
| .quoteblock .attribution br, .verseblock .attribution br { display: none; } |
| .quoteblock .attribution cite, .verseblock .attribution cite { display: block; letter-spacing: -0.025em; color: #5e93b8; } |
| |
| .quoteblock.abstract { margin: 0 0 0.75em 0; display: block; } |
| .quoteblock.abstract blockquote, .quoteblock.abstract blockquote p { text-align: left; word-spacing: 0; } |
| .quoteblock.abstract blockquote:before, .quoteblock.abstract blockquote p:first-of-type:before { display: none; } |
| |
| table.tableblock { max-width: 100%; border-collapse: separate; } |
| table.tableblock td > .paragraph:last-child p > p:last-child, table.tableblock th > p:last-child, table.tableblock td > p:last-child { margin-bottom: 0; } |
| |
| table.tableblock, th.tableblock, td.tableblock { border: 0 solid #d8d8ce; } |
| |
| table.grid-all > thead > tr > .tableblock, table.grid-all > tbody > tr > .tableblock { border-width: 0 1px 1px 0; } |
| |
| table.grid-all > tfoot > tr > .tableblock { border-width: 1px 1px 0 0; } |
| |
| table.grid-cols > * > tr > .tableblock { border-width: 0 1px 0 0; } |
| |
| table.grid-rows > thead > tr > .tableblock, table.grid-rows > tbody > tr > .tableblock { border-width: 0 0 1px 0; } |
| |
| table.grid-rows > tfoot > tr > .tableblock { border-width: 1px 0 0 0; } |
| |
| table.grid-all > * > tr > .tableblock:last-child, table.grid-cols > * > tr > .tableblock:last-child { border-right-width: 0; } |
| |
| table.grid-all > tbody > tr:last-child > .tableblock, table.grid-all > thead:last-child > tr > .tableblock, table.grid-rows > tbody > tr:last-child > .tableblock, table.grid-rows > thead:last-child > tr > .tableblock { border-bottom-width: 0; } |
| |
| table.frame-all { border-width: 1px; } |
| |
| table.frame-sides { border-width: 0 1px; } |
| |
| table.frame-topbot { border-width: 1px 0; } |
| |
| th.halign-left, td.halign-left { text-align: left; } |
| |
| th.halign-right, td.halign-right { text-align: right; } |
| |
| th.halign-center, td.halign-center { text-align: center; } |
| |
| th.valign-top, td.valign-top { vertical-align: top; } |
| |
| th.valign-bottom, td.valign-bottom { vertical-align: bottom; } |
| |
| th.valign-middle, td.valign-middle { vertical-align: middle; } |
| |
| table thead th, table tfoot th { font-weight: bold; } |
| |
| tbody tr th { display: table-cell; line-height: 1.4; background: -webkit-linear-gradient(top, #add386, #90b66a); } |
| |
| tbody tr th, tbody tr th p, tfoot tr th, tfoot tr th p { color: white; font-weight: bold; } |
| |
| p.tableblock > code:only-child { background: none; padding: 0; } |
| |
| p.tableblock { font-size: 1em; } |
| |
| td > div.verse { white-space: pre; } |
| |
| ol { margin-left: 1.75em; } |
| |
| ul li ol { margin-left: 1.5em; } |
| |
| dl dd { margin-left: 1.125em; } |
| |
| dl dd:last-child, dl dd:last-child > :last-child { margin-bottom: 0; } |
| |
| ol > li p, ul > li p, ul dd, ol dd, .olist .olist, .ulist .ulist, .ulist .olist, .olist .ulist { margin-bottom: 0.375em; } |
| |
| ul.checklist, ul.none, ol.none, ul.no-bullet, ol.no-bullet, ol.unnumbered, ul.unstyled, ol.unstyled { list-style-type: none; } |
| |
| ul.no-bullet, ol.no-bullet, ol.unnumbered { margin-left: 0.625em; } |
| |
| ul.unstyled, ol.unstyled { margin-left: 0; } |
| |
| ul.checklist { margin-left: 0.625em; } |
| |
| ul.checklist li > p:first-child > .fa-square-o:first-child, ul.checklist li > p:first-child > .fa-check-square-o:first-child { width: 1.25em; font-size: 0.8em; position: relative; bottom: 0.125em; } |
| |
| ul.checklist li > p:first-child > input[type="checkbox"]:first-child { margin-right: 0.25em; } |
| |
| ul.inline { display: -ms-flexbox; display: -webkit-box; display: flex; -ms-flex-flow: row wrap; -webkit-flex-flow: row wrap; flex-flow: row wrap; list-style: none; margin: 0 0 0.375em -0.75em; } |
| |
| ul.inline > li { margin-left: 0.75em; } |
| |
| .unstyled dl dt { font-weight: normal; font-style: normal; } |
| |
| ol.arabic { list-style-type: decimal; } |
| |
| ol.decimal { list-style-type: decimal-leading-zero; } |
| |
| ol.loweralpha { list-style-type: lower-alpha; } |
| |
| ol.upperalpha { list-style-type: upper-alpha; } |
| |
| ol.lowerroman { list-style-type: lower-roman; } |
| |
| ol.upperroman { list-style-type: upper-roman; } |
| |
| ol.lowergreek { list-style-type: lower-greek; } |
| |
| .hdlist > table, .colist > table { border: 0; background: none; } |
| .hdlist > table > tbody > tr, .colist > table > tbody > tr { background: none; } |
| |
| td.hdlist1, td.hdlist2 { vertical-align: top; padding: 0 0.625em; } |
| |
| td.hdlist1 { font-weight: bold; padding-bottom: 0.75em; } |
| |
| .literalblock + .colist, .listingblock + .colist { margin-top: -0.5em; } |
| |
| .colist > table tr > td:first-of-type { padding: 0.4em 0.75em 0 0.75em; line-height: 1; vertical-align: top; } |
| .colist > table tr > td:first-of-type img { max-width: initial; } |
| .colist > table tr > td:last-of-type { padding: 0.25em 0; } |
| |
| .thumb, .th { line-height: 0; display: inline-block; border: solid 4px white; -webkit-box-shadow: 0 0 0 1px #dddddd; box-shadow: 0 0 0 1px #dddddd; } |
| |
| .imageblock.left, .imageblock[style*="float: left"] { margin: 0.25em 0.625em 1.25em 0; } |
| .imageblock.right, .imageblock[style*="float: right"] { margin: 0.25em 0 1.25em 0.625em; } |
| .imageblock > .title { margin-bottom: 0; } |
| .imageblock.thumb, .imageblock.th { border-width: 6px; } |
| .imageblock.thumb > .title, .imageblock.th > .title { padding: 0 0.125em; } |
| |
| .image.left, .image.right { margin-top: 0.25em; margin-bottom: 0.25em; display: inline-block; line-height: 0; } |
| .image.left { margin-right: 0.625em; } |
| .image.right { margin-left: 0.625em; } |
| |
| a.image { text-decoration: none; display: inline-block; } |
| a.image object { pointer-events: none; } |
| |
| sup.footnote, sup.footnoteref { font-size: 0.875em; position: static; vertical-align: super; } |
| sup.footnote a, sup.footnoteref a { text-decoration: none; } |
| sup.footnote a:active, sup.footnoteref a:active { text-decoration: underline; } |
| |
| #footnotes { padding-top: 0.75em; padding-bottom: 0.75em; margin-bottom: 0.625em; } |
| #footnotes hr { width: 20%; min-width: 6.25em; margin: -0.25em 0 0.75em 0; border-width: 1px 0 0 0; } |
| #footnotes .footnote { padding: 0 0.375em 0 0.225em; line-height: 1.3334; font-size: 0.875em; margin-left: 1.2em; margin-bottom: 0.2em; } |
| #footnotes .footnote a:first-of-type { font-weight: bold; text-decoration: none; margin-left: -1.05em; } |
| #footnotes .footnote:last-of-type { margin-bottom: 0; } |
| #content #footnotes { margin-top: -0.625em; margin-bottom: 0; padding: 0.75em 0; } |
| |
| .gist .file-data > table { border: 0; background: #fff; width: 100%; margin-bottom: 0; } |
| .gist .file-data > table td.line-data { width: 99%; } |
| |
| div.unbreakable { page-break-inside: avoid; } |
| |
| .big { font-size: larger; } |
| |
| .small { font-size: smaller; } |
| |
| .underline { text-decoration: underline; } |
| |
| .overline { text-decoration: overline; } |
| |
| .line-through { text-decoration: line-through; } |
| |
| .aqua { color: #00bfbf; } |
| |
| .aqua-background { background-color: #00fafa; } |
| |
| .black { color: black; } |
| |
| .black-background { background-color: black; } |
| |
| .blue { color: #0000bf; } |
| |
| .blue-background { background-color: #0000fa; } |
| |
| .fuchsia { color: #bf00bf; } |
| |
| .fuchsia-background { background-color: #fa00fa; } |
| |
| .gray { color: #606060; } |
| |
| .gray-background { background-color: #7d7d7d; } |
| |
| .green { color: #006000; } |
| |
| .green-background { background-color: #007d00; } |
| |
| .lime { color: #00bf00; } |
| |
| .lime-background { background-color: #00fa00; } |
| |
| .maroon { color: #600000; } |
| |
| .maroon-background { background-color: #7d0000; } |
| |
| .navy { color: #000060; } |
| |
| .navy-background { background-color: #00007d; } |
| |
| .olive { color: #606000; } |
| |
| .olive-background { background-color: #7d7d00; } |
| |
| .purple { color: #600060; } |
| |
| .purple-background { background-color: #7d007d; } |
| |
| .red { color: #bf0000; } |
| |
| .red-background { background-color: #fa0000; } |
| |
| .silver { color: #909090; } |
| |
| .silver-background { background-color: #bcbcbc; } |
| |
| .teal { color: #006060; } |
| |
| .teal-background { background-color: #007d7d; } |
| |
| .white { color: #bfbfbf; } |
| |
| .white-background { background-color: #fafafa; } |
| |
| .yellow { color: #bfbf00; } |
| |
| .yellow-background { background-color: #fafa00; } |
| |
| span.icon > .fa { cursor: default; } |
| a span.icon > .fa { cursor: inherit; } |
| |
| .admonitionblock td.icon [class^="fa icon-"] { font-size: 2.5em; text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5); cursor: default; } |
| .admonitionblock td.icon .icon-note:before { content: "\f05a"; color: #29475c; } |
| .admonitionblock td.icon .icon-tip:before { content: "\f0eb"; text-shadow: 1px 1px 2px rgba(155, 155, 0, 0.8); color: #111; } |
| .admonitionblock td.icon .icon-warning:before { content: "\f071"; color: #bf6900; } |
| .admonitionblock td.icon .icon-caution:before { content: "\f06d"; color: #bf3400; } |
| .admonitionblock td.icon .icon-important:before { content: "\f06a"; color: #bf0000; } |
| |
| .conum[data-value] { display: inline-block; color: #fff !important; background-color: black; -webkit-border-radius: 100px; border-radius: 100px; text-align: center; font-size: 0.75em; width: 1.67em; height: 1.67em; line-height: 1.67em; font-family: "Open Sans", "DejaVu Sans", sans-serif; font-style: normal; font-weight: bold; } |
| .conum[data-value] * { color: #fff !important; } |
| .conum[data-value] + b { display: none; } |
| .conum[data-value]:after { content: attr(data-value); } |
| pre .conum[data-value] { position: relative; top: -0.125em; } |
| |
| b.conum * { color: inherit !important; } |
| |
| .conum:not([data-value]):empty { display: none; } |
| |
| h1, h2, h3, #toctitle, .sidebarblock > .content > .title, h4, h5, h6 { border-bottom: 1px solid #dddddd; } |
| |
| .sect1 { padding-bottom: 0; } |
| |
| #toctitle { color: #00406F; font-weight: normal; margin-top: 1.5em; } |
| |
| .sidebarblock { border-color: #aaa; } |
| |
| code { -webkit-border-radius: 4px; border-radius: 4px; } |
| |
| p.tableblock.header { color: #6d6e71; } |
| |
| .literalblock pre, .listingblock pre { background: #eeeeee; } |
| |
| </style> |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"> |
| <style> |
| /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */ |
| /*pre.CodeRay {background-color:#f7f7f8;}*/ |
| .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em} |
| .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)} |
| .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)} |
| table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none} |
| table.CodeRay td{vertical-align: top;line-height:1.45} |
| table.CodeRay td.line-numbers{text-align:right} |
| table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)} |
| table.CodeRay td.code{padding:0 0 0 .5em} |
| table.CodeRay td.code>pre{padding:0} |
| .CodeRay .debug{color:#fff !important;background:#000080 !important} |
| .CodeRay .annotation{color:#007} |
| .CodeRay .attribute-name{color:#000080} |
| .CodeRay .attribute-value{color:#700} |
| .CodeRay .binary{color:#509} |
| .CodeRay .comment{color:#998;font-style:italic} |
| .CodeRay .char{color:#04d} |
| .CodeRay .char .content{color:#04d} |
| .CodeRay .char .delimiter{color:#039} |
| .CodeRay .class{color:#458;font-weight:bold} |
| .CodeRay .complex{color:#a08} |
| .CodeRay .constant,.CodeRay .predefined-constant{color:#008080} |
| .CodeRay .color{color:#099} |
| .CodeRay .class-variable{color:#369} |
| .CodeRay .decorator{color:#b0b} |
| .CodeRay .definition{color:#099} |
| .CodeRay .delimiter{color:#000} |
| .CodeRay .doc{color:#970} |
| .CodeRay .doctype{color:#34b} |
| .CodeRay .doc-string{color:#d42} |
| .CodeRay .escape{color:#666} |
| .CodeRay .entity{color:#800} |
| .CodeRay .error{color:#808} |
| .CodeRay .exception{color:inherit} |
| .CodeRay .filename{color:#099} |
| .CodeRay .function{color:#900;font-weight:bold} |
| .CodeRay .global-variable{color:#008080} |
| .CodeRay .hex{color:#058} |
| .CodeRay .integer,.CodeRay .float{color:#099} |
| .CodeRay .include{color:#555} |
| .CodeRay .inline{color:#000} |
| .CodeRay .inline .inline{background:#ccc} |
| .CodeRay .inline .inline .inline{background:#bbb} |
| .CodeRay .inline .inline-delimiter{color:#d14} |
| .CodeRay .inline-delimiter{color:#d14} |
| .CodeRay .important{color:#555;font-weight:bold} |
| .CodeRay .interpreted{color:#b2b} |
| .CodeRay .instance-variable{color:#008080} |
| .CodeRay .label{color:#970} |
| .CodeRay .local-variable{color:#963} |
| .CodeRay .octal{color:#40e} |
| .CodeRay .predefined{color:#369} |
| .CodeRay .preprocessor{color:#579} |
| .CodeRay .pseudo-class{color:#555} |
| .CodeRay .directive{font-weight:bold} |
| .CodeRay .type{font-weight:bold} |
| .CodeRay .predefined-type{color:inherit} |
| .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold} |
| .CodeRay .key{color:#808} |
| .CodeRay .key .delimiter{color:#606} |
| .CodeRay .key .char{color:#80f} |
| .CodeRay .value{color:#088} |
| .CodeRay .regexp .delimiter{color:#808} |
| .CodeRay .regexp .content{color:#808} |
| .CodeRay .regexp .modifier{color:#808} |
| .CodeRay .regexp .char{color:#d14} |
| .CodeRay .regexp .function{color:#404;font-weight:bold} |
| .CodeRay .string{color:#d20} |
| .CodeRay .string .string .string{background:#ffd0d0} |
| .CodeRay .string .content{color:#d14} |
| .CodeRay .string .char{color:#d14} |
| .CodeRay .string .delimiter{color:#d14} |
| .CodeRay .shell{color:#d14} |
| .CodeRay .shell .delimiter{color:#d14} |
| .CodeRay .symbol{color:#990073} |
| .CodeRay .symbol .content{color:#a60} |
| .CodeRay .symbol .delimiter{color:#630} |
| .CodeRay .tag{color:#008080} |
| .CodeRay .tag-special{color:#d70} |
| .CodeRay .variable{color:#036} |
| .CodeRay .insert{background:#afa} |
| .CodeRay .delete{background:#faa} |
| .CodeRay .change{color:#aaf;background:#007} |
| .CodeRay .head{color:#f8f;background:#505} |
| .CodeRay .insert .insert{color:#080} |
| .CodeRay .delete .delete{color:#800} |
| .CodeRay .change .change{color:#66f} |
| .CodeRay .head .head{color:#f4f} |
| </style> |
| <link rel="stylesheet" href="../katex/katex.min.css"> |
| <script src="../katex/katex.min.js"></script> |
| <script src="../katex/contrib/auto-render.min.js"></script> |
| <!-- Use KaTeX to render math once document is loaded, see |
| https://github.com/Khan/KaTeX/tree/master/contrib/auto-render --> |
| <script> |
| document.addEventListener("DOMContentLoaded", function () { |
| renderMathInElement( |
| document.body, |
| { |
| delimiters: [ |
| { left: "$$", right: "$$", display: true}, |
| { left: "\\[", right: "\\]", display: true}, |
| { left: "$", right: "$", display: false}, |
| { left: "\\(", right: "\\)", display: false} |
| ] |
| } |
| ); |
| }); |
| </script></head> |
| <body class="book toc2 toc-left" style="max-width: 100;"> |
| <div id="header"> |
| <h1>The OpenCL<sup>™</sup> Specification</h1> |
| <div class="details"> |
| <span id="author" class="author">Khronos<sup>®</sup> OpenCL Working Group</span><br> |
| <span id="revnumber">version v3.0.6,</span> |
| <span id="revdate">Fri, 18 Dec 2020 12:00:00 +0000</span> |
| <br><span id="revremark">from git branch: master commit: e9a4d468b1a0a38c1e10b8af484bb2bbb495e2b7</span> |
| </div> |
| <div id="toc" class="toc2"> |
| <div id="toctitle">Table of Contents</div> |
| <ul class="sectlevel1"> |
| <li><a href="#_introduction">1. Introduction</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_normative_references">1.1. Normative References</a></li> |
| <li><a href="#_version_numbers">1.2. Version Numbers</a></li> |
| <li><a href="#unified-spec">1.3. Unified Specification</a></li> |
| </ul> |
| </li> |
| <li><a href="#_glossary">2. Glossary</a></li> |
| <li><a href="#_the_opencl_architecture">3. The OpenCL Architecture</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_platform_model">3.1. Platform Model</a></li> |
| <li><a href="#_execution_model">3.2. Execution Model</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_mapping_work_items_onto_an_ndrange">3.2.1. Mapping work-items onto an NDRange</a></li> |
| <li><a href="#_execution_of_kernel_instances">3.2.2. Execution of kernel-instances</a></li> |
| <li><a href="#device-side-enqueue">3.2.3. Device-side enqueue</a></li> |
| <li><a href="#execution-model-sync">3.2.4. Synchronization</a></li> |
| <li><a href="#_categories_of_kernels">3.2.5. Categories of Kernels</a></li> |
| </ul> |
| </li> |
| <li><a href="#_memory_model">3.3. Memory Model</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_fundamental_memory_regions">3.3.1. Fundamental Memory Regions</a></li> |
| <li><a href="#_memory_objects">3.3.2. Memory Objects</a></li> |
| <li><a href="#shared-virtual-memory">3.3.3. Shared Virtual Memory</a></li> |
| <li><a href="#_memory_consistency_model_for_opencl_1_x">3.3.4. Memory Consistency Model for OpenCL 1.x</a></li> |
| <li><a href="#memory-consistency-model">3.3.5. Memory Consistency Model for OpenCL 2.x</a></li> |
| <li><a href="#_overview_of_atomic_and_fence_operations">3.3.6. Overview of atomic and fence operations</a></li> |
| <li><a href="#memory-ordering-rules">3.3.7. Memory Ordering Rules</a></li> |
| </ul> |
| </li> |
| <li><a href="#opencl-framework">3.4. The OpenCL Framework</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_mixed_version_support">3.4.1. Mixed Version Support</a></li> |
| <li><a href="#_backwards_compatibility">3.4.2. Backwards Compatibility</a></li> |
| <li><a href="#_versioning">3.4.3. Versioning</a></li> |
| </ul> |
| </li> |
| </ul> |
| </li> |
| <li><a href="#opencl-platform-layer">4. The OpenCL Platform Layer</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_querying_platform_info">4.1. Querying Platform Info</a></li> |
| <li><a href="#platform-querying-devices">4.2. Querying Devices</a></li> |
| <li><a href="#_partitioning_a_device">4.3. Partitioning a Device</a></li> |
| <li><a href="#_contexts">4.4. Contexts</a></li> |
| </ul> |
| </li> |
| <li><a href="#opencl-runtime">5. The OpenCL Runtime</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_command_queues">5.1. Command Queues</a></li> |
| <li><a href="#_buffer_objects">5.2. Buffer Objects</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_creating_buffer_objects">5.2.1. Creating Buffer Objects</a></li> |
| <li><a href="#_reading_writing_and_copying_buffer_objects">5.2.2. Reading, Writing and Copying Buffer Objects</a></li> |
| <li><a href="#_filling_buffer_objects">5.2.3. Filling Buffer Objects</a></li> |
| <li><a href="#_mapping_buffer_objects">5.2.4. Mapping Buffer Objects</a></li> |
| </ul> |
| </li> |
| <li><a href="#_image_objects">5.3. Image Objects</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_creating_image_objects">5.3.1. Creating Image Objects</a></li> |
| <li><a href="#_querying_list_of_supported_image_formats">5.3.2. Querying List of Supported Image Formats</a></li> |
| <li><a href="#_reading_writing_and_copying_image_objects">5.3.3. Reading, Writing and Copying Image Objects</a></li> |
| <li><a href="#_filling_image_objects">5.3.4. Filling Image Objects</a></li> |
| <li><a href="#_copying_between_image_and_buffer_objects">5.3.5. Copying between Image and Buffer Objects</a></li> |
| <li><a href="#_mapping_image_objects">5.3.6. Mapping Image Objects</a></li> |
| <li><a href="#image-object-queries">5.3.7. Image Object Queries</a></li> |
| </ul> |
| </li> |
| <li><a href="#_pipes">5.4. Pipes</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_creating_pipe_objects">5.4.1. Creating Pipe Objects</a></li> |
| <li><a href="#_pipe_object_queries">5.4.2. Pipe Object Queries</a></li> |
| </ul> |
| </li> |
| <li><a href="#_querying_unmapping_migrating_retaining_and_releasing_memory_objects">5.5. Querying, Unmapping, Migrating, Retaining and Releasing Memory Objects</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_retaining_and_releasing_memory_objects">5.5.1. Retaining and Releasing Memory Objects</a></li> |
| <li><a href="#unmapping-mapped-memory">5.5.2. Unmapping Mapped Memory Objects</a></li> |
| <li><a href="#accessing-mapped-regions">5.5.3. Accessing mapped regions of a memory object</a></li> |
| <li><a href="#_migrating_memory_objects">5.5.4. Migrating Memory Objects</a></li> |
| <li><a href="#memory-object-queries">5.5.5. Memory Object Queries</a></li> |
| </ul> |
| </li> |
| <li><a href="#_shared_virtual_memory">5.6. Shared Virtual Memory</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_svm_sharing_granularity_coarse_and_fine_grained_sharing">5.6.1. SVM sharing granularity: coarse- and fine- grained sharing</a></li> |
| <li><a href="#_memory_consistency_for_svm_allocations">5.6.2. Memory consistency for SVM allocations</a></li> |
| </ul> |
| </li> |
| <li><a href="#_sampler_objects">5.7. Sampler Objects</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_creating_sampler_objects">5.7.1. Creating Sampler Objects</a></li> |
| <li><a href="#_sampler_object_queries">5.7.2. Sampler Object Queries</a></li> |
| </ul> |
| </li> |
| <li><a href="#_program_objects">5.8. Program Objects</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_creating_program_objects">5.8.1. Creating Program Objects</a></li> |
| <li><a href="#_retaining_and_releasing_program_objects">5.8.2. Retaining and Releasing Program Objects</a></li> |
| <li><a href="#_setting_spir_v_specialization_constants">5.8.3. Setting SPIR-V specialization constants</a></li> |
| <li><a href="#_building_program_executables">5.8.4. Building Program Executables</a></li> |
| <li><a href="#_separate_compilation_and_linking_of_programs">5.8.5. Separate Compilation and Linking of Programs</a></li> |
| <li><a href="#compiler-options">5.8.6. Compiler Options</a></li> |
| <li><a href="#linker-options">5.8.7. Linker Options</a></li> |
| <li><a href="#_unloading_the_opencl_compiler">5.8.8. Unloading the OpenCL Compiler</a></li> |
| <li><a href="#_program_object_queries">5.8.9. Program Object Queries</a></li> |
| </ul> |
| </li> |
| <li><a href="#_kernel_objects">5.9. Kernel Objects</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_creating_kernel_objects">5.9.1. Creating Kernel Objects</a></li> |
| <li><a href="#_setting_kernel_arguments">5.9.2. Setting Kernel Arguments</a></li> |
| <li><a href="#_copying_kernel_objects">5.9.3. Copying Kernel Objects</a></li> |
| <li><a href="#_kernel_object_queries">5.9.4. Kernel Object Queries</a></li> |
| </ul> |
| </li> |
| <li><a href="#_executing_kernels">5.10. Executing Kernels</a></li> |
| <li><a href="#event-objects">5.11. Event Objects</a></li> |
| <li><a href="#markers-barriers-waiting-for-events">5.12. Markers, Barriers and Waiting for Events</a></li> |
| <li><a href="#_out_of_order_execution_of_kernels_and_memory_object_commands">5.13. Out-of-order Execution of Kernels and Memory Object Commands</a></li> |
| <li><a href="#profiling-operations">5.14. Profiling Operations on Memory Objects and Kernels</a></li> |
| <li><a href="#_flush_and_finish">5.15. Flush and Finish</a></li> |
| </ul> |
| </li> |
| <li><a href="#_associated_opencl_specification">6. Associated OpenCL specification</a> |
| <ul class="sectlevel2"> |
| <li><a href="#spirv-il">6.1. SPIR-V Intermediate Language</a></li> |
| <li><a href="#opencl-extensions">6.2. Extensions to OpenCL</a></li> |
| <li><a href="#opencl-c-kernel-language">6.3. The OpenCL C Kernel Language</a></li> |
| </ul> |
| </li> |
| <li><a href="#opencl-embedded-profile">7. OpenCL Embedded Profile</a></li> |
| <li><a href="#_host_environment_and_thread_safety">Appendix A: Host environment and thread safety</a> |
| <ul class="sectlevel2"> |
| <li><a href="#shared-opencl-objects">Shared OpenCL Objects</a></li> |
| <li><a href="#_multiple_host_threads">Multiple Host Threads</a></li> |
| <li><a href="#_global_constructors_and_destructors">Global constructors and destructors</a></li> |
| </ul> |
| </li> |
| <li><a href="#_portability">Appendix B: Portability</a></li> |
| <li><a href="#data-types">Appendix C: Application Data Types</a> |
| <ul class="sectlevel2"> |
| <li><a href="#scalar-data-types">Supported Application Scalar Data Types</a></li> |
| <li><a href="#vector-data-types">Supported Application Vector Data Types</a></li> |
| <li><a href="#alignment-app-data-types">Alignment of Application Data Types</a></li> |
| <li><a href="#_vector_literals">Vector Literals</a></li> |
| <li><a href="#vector-components">Vector Components</a> |
| <ul class="sectlevel3"> |
| <li><a href="#_named_vector_components_notation">Named vector components notation</a></li> |
| <li><a href="#_highlow_vector_component_notation">High/Low vector component notation</a></li> |
| <li><a href="#_native_vector_type_notation">Native vector type notation</a></li> |
| </ul> |
| </li> |
| <li><a href="#_implicit_conversions">Implicit Conversions</a></li> |
| <li><a href="#_explicit_casts">Explicit Casts</a></li> |
| <li><a href="#_other_operators_and_functions">Other operators and functions</a></li> |
| <li><a href="#_application_constant_definitions">Application constant definitions</a></li> |
| </ul> |
| </li> |
| <li><a href="#check-copy-overlap">Appendix D: Checking for Memory Copy Overlap</a></li> |
| <li><a href="#changes_to_opencl">Appendix E: Changes to OpenCL</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_summary_of_changes_from_opencl_1_0_to_opencl_1_1">Summary of changes from OpenCL 1.0 to OpenCL 1.1</a></li> |
| <li><a href="#_summary_of_changes_from_opencl_1_1_to_opencl_1_2">Summary of changes from OpenCL 1.1 to OpenCL 1.2</a></li> |
| <li><a href="#_summary_of_changes_from_opencl_1_2_to_opencl_2_0">Summary of changes from OpenCL 1.2 to OpenCL 2.0</a></li> |
| <li><a href="#_summary_of_changes_from_opencl_2_0_to_opencl_2_1">Summary of changes from OpenCL 2.0 to OpenCL 2.1</a></li> |
| <li><a href="#_summary_of_changes_from_opencl_2_1_to_opencl_2_2">Summary of changes from OpenCL 2.1 to OpenCL 2.2</a></li> |
| <li><a href="#_summary_of_changes_from_opencl_2_2_to_opencl_3_0">Summary of changes from OpenCL 2.2 to OpenCL 3.0</a></li> |
| </ul> |
| </li> |
| <li><a href="#error_codes">Appendix F: Error Codes</a></li> |
| <li><a href="#error_other_misc_enums">Appendix G: Other Miscellaneous Enums</a></li> |
| <li><a href="#opencl-3.0-backwards-compatibility">Appendix H: OpenCL 3.0 Backwards Compatibility</a> |
| <ul class="sectlevel2"> |
| <li><a href="#_shared_virtual_memory_2">Shared Virtual Memory</a></li> |
| <li><a href="#_memory_consistency_model">Memory Consistency Model</a></li> |
| <li><a href="#_device_side_enqueue">Device-Side Enqueue</a></li> |
| <li><a href="#_pipes_2">Pipes</a></li> |
| <li><a href="#_program_scope_global_variables">Program Scope Global Variables</a></li> |
| <li><a href="#_non_uniform_work_groups">Non-Uniform Work Groups</a></li> |
| <li><a href="#_read_write_images">Read-Write Images</a></li> |
| <li><a href="#_creating_2d_images_from_buffers">Creating 2D Images from Buffers</a></li> |
| <li><a href="#_srgb_images">sRGB Images</a></li> |
| <li><a href="#_depth_images">Depth Images</a></li> |
| <li><a href="#_device_and_host_timer_synchronization">Device and Host Timer Synchronization</a></li> |
| <li><a href="#_intermediate_language_programs">Intermediate Language Programs</a></li> |
| <li><a href="#_subgroups">Subgroups</a></li> |
| <li><a href="#_program_initialization_and_clean_up_kernels">Program Initialization and Clean-Up Kernels</a></li> |
| <li><a href="#_3d_image_writes">3D Image Writes</a></li> |
| <li><a href="#_work_group_collective_functions">Work Group Collective Functions</a></li> |
| <li><a href="#_generic_address_space">Generic Address Space</a></li> |
| <li><a href="#_language_features_that_were_already_optional">Language Features that Were Already Optional</a></li> |
| </ul> |
| </li> |
| <li><a href="#_acknowledgements">Acknowledgements</a></li> |
| </ul> |
| </div> |
| </div> |
| <div id="content"> |
| <div id="preamble"> |
| <div class="sectionbody"> |
| <div style="page-break-after: always;"></div> |
| <div class="paragraph"> |
| <p>Copyright 2008-2020 The Khronos Group.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This specification is protected by copyright laws and contains material proprietary |
| to the Khronos Group, Inc. Except as described by these terms, it or any components |
| may not be reproduced, republished, distributed, transmitted, displayed, broadcast |
| or otherwise exploited in any manner without the express prior written permission |
| of Khronos Group.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Khronos Group grants a conditional copyright license to use and reproduce the |
| unmodified specification for any purpose, without fee or royalty, EXCEPT no licenses |
| to any patent, trademark or other intellectual property rights are granted under |
| these terms. Parties desiring to implement the specification and make use of |
| Khronos trademarks in relation to that implementation, and receive reciprocal patent |
| license protection under the Khronos IP Policy must become Adopters and confirm the |
| implementation as conformant under the process defined by Khronos for this |
| specification; see <a href="https://www.khronos.org/adopters" class="bare">https://www.khronos.org/adopters</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Khronos Group makes no, and expressly disclaims any, representations or warranties, |
| express or implied, regarding this specification, including, without limitation: |
| merchantability, fitness for a particular purpose, non-infringement of any |
| intellectual property, correctness, accuracy, completeness, timeliness, and |
| reliability. Under no circumstances will the Khronos Group, or any of its Promoters, |
| Contributors or Members, or their respective partners, officers, directors, |
| employees, agents or representatives be liable for any damages, whether direct, |
| indirect, special or consequential damages for lost revenues, lost profits, or |
| otherwise, arising from or in connection with these materials.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Vulkan and Khronos are registered trademarks, and OpenXR, SPIR, SPIR-V, SYCL, WebGL, |
| WebCL, OpenVX, OpenVG, EGL, COLLADA, glTF, NNEF, OpenKODE, OpenKCAM, StreamInput, |
| OpenWF, OpenSL ES, OpenMAX, OpenMAX AL, OpenMAX IL, OpenMAX DL, OpenML and DevU are |
| trademarks of the Khronos Group Inc. ASTC is a trademark of ARM Holdings PLC, |
| OpenCL is a trademark of Apple Inc. and OpenGL and OpenML are registered trademarks |
| and the OpenGL ES and OpenGL SC logos are trademarks of Silicon Graphics |
| International used under license by Khronos. All other product names, trademarks, |
| and/or company names are used solely for identification and belong to their |
| respective owners.</p> |
| </div> |
| <div style="page-break-after: always;"></div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_introduction"><a class="anchor" href="#_introduction"></a>1. Introduction</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>Modern processor architectures have embraced parallelism as an important |
| pathway to increased performance. |
| Facing technical challenges with higher clock speeds in a fixed power |
| envelope, Central Processing Units (CPUs) now improve performance by adding |
| multiple cores. |
| Graphics Processing Units (GPUs) have also evolved from fixed function |
| rendering devices into programmable parallel processors. |
| As todays computer systems often include highly parallel CPUs, GPUs and |
| other types of processors, it is important to enable software developers to |
| take full advantage of these heterogeneous processing platforms.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Creating applications for heterogeneous parallel processing platforms is |
| challenging as traditional programming approaches for multi-core CPUs and |
| GPUs are very different. |
| CPU-based parallel programming models are typically based on standards but |
| usually assume a shared address space and do not encompass vector |
| operations. |
| General purpose GPU programming models address complex memory hierarchies |
| and vector operations but are traditionally platform-, vendor- or |
| hardware-specific. |
| These limitations make it difficult for a developer to access the compute |
| power of heterogeneous CPUs, GPUs and other types of processors from a |
| single, multi-platform source code base. |
| More than ever, there is a need to enable software developers to effectively |
| take full advantage of heterogeneous processing platforms from high |
| performance compute servers, through desktop computer systems to handheld |
| devices - that include a diverse mix of parallel CPUs, GPUs and other |
| processors such as DSPs and the Cell/B.E. |
| processor.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>OpenCL</strong> (Open Computing Language) is an open royalty-free standard for |
| general purpose parallel programming across CPUs, GPUs and other processors, |
| giving software developers portable and efficient access to the power of |
| these heterogeneous processing platforms.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL supports a wide range of applications, ranging from embedded and |
| consumer software to HPC solutions, through a low-level, high-performance, |
| portable abstraction. |
| By creating an efficient, close-to-the-metal programming interface, OpenCL |
| will form the foundation layer of a parallel computing ecosystem of |
| platform-independent tools, middleware and applications. |
| OpenCL is particularly suited to play an increasingly significant role in |
| emerging interactive graphics applications that combine general parallel |
| compute algorithms with graphics rendering pipelines.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL consists of an API for coordinating parallel computation across |
| heterogeneous processors, a cross-platform programming language, and a |
| cross-platform intermediate language with a well-specified computation |
| environment. |
| The OpenCL standard:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Supports both data- and task-based parallel programming models</p> |
| </li> |
| <li> |
| <p>Supports kernels written using a subset of ISO C99 with extensions |
| for parallel execution</p> |
| </li> |
| <li> |
| <p>Supports kernels represented by a portable and self-contained |
| intermediate language (e.g. SPIR-V) with support for parallel execution</p> |
| </li> |
| <li> |
| <p>Defines consistent numerical requirements based on IEEE 754</p> |
| </li> |
| <li> |
| <p>Defines a configuration profile for handheld and embedded devices</p> |
| </li> |
| <li> |
| <p>Supports efficient interop with OpenGL, OpenGL ES and other APIs</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>This document begins with an overview of basic concepts and the architecture |
| of OpenCL, followed by a detailed description of its execution model, memory |
| model and synchronization support. |
| It then discusses the OpenCL platform and runtime API. |
| Some examples are given that describe sample compute use-cases and how they |
| would be written in OpenCL. |
| The specification is divided into a core specification that any OpenCL |
| compliant implementation must support; a handheld/embedded profile which |
| relaxes the OpenCL compliance requirements for handheld and embedded |
| devices; and a set of optional extensions that are likely to move into the |
| core specification in later revisions of the OpenCL specification.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_normative_references"><a class="anchor" href="#_normative_references"></a>1.1. Normative References</h3> |
| <div class="paragraph"> |
| <p>Normative references are references to external documents or resources to |
| which implementers of OpenCL must comply with all, or specified portions of, |
| as described in this specification.</p> |
| </div> |
| <div id="iso-c11" class="paragraph"> |
| <p><em>ISO/IEC 9899:2011 - Information technology - Programming languages - C</em>, |
| <a href="https://www.iso.org/standard/57853.html" class="bare">https://www.iso.org/standard/57853.html</a> (final specification), |
| <a href="http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf" class="bare">http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf</a> (last public |
| draft).</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_version_numbers"><a class="anchor" href="#_version_numbers"></a>1.2. Version Numbers</h3> |
| <div class="paragraph"> |
| <p>The OpenCL version number follows a <em>major.minor-revision</em> scheme. When this |
| version number is used within the API it generally only includes the |
| <em>major.minor</em> components of the version number.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A difference in the <em>major</em> or <em>minor</em> version number indicates that some |
| amount of new functionality has been added to the specification, and may also |
| include behavior changes and bug fixes. |
| Functionality may also be deprecated or removed when the <em>major</em> or <em>minor</em> |
| version changes.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A difference in the <em>revision</em> number indicates small changes to the |
| specification, typically to fix a bug or to clarify language. |
| When the <em>revision</em> number changes there may be an impact on the behavior of |
| existing functionality, but this should not affect backwards compatibility. |
| Functionality should not be added or removed when the <em>revision</em> number |
| changes.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="unified-spec"><a class="anchor" href="#unified-spec"></a>1.3. Unified Specification</h3> |
| <div class="paragraph"> |
| <p>This document specifies all versions of the OpenCL API.</p> |
| </div> |
| <div class="paragraph"> |
| <p>There are three ways that an OpenCL feature may be described in terms of what |
| versions of OpenCL support that feature.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Missing before <em>major.minor</em>: Features that were introduced in |
| version <em>major.minor</em>. Implementations of an earlier version of OpenCL |
| will not provide these features.</p> |
| </li> |
| <li> |
| <p>Deprecated by <em>major.minor</em>: Features that were deprecated |
| in version <em>major.minor</em>, see the definition of deprecation in the |
| glossary.</p> |
| </li> |
| <li> |
| <p>Universal: Features that have no mention of what version they are missing |
| before or deprecated by are available in all versions of OpenCL.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_glossary"><a class="anchor" href="#_glossary"></a>2. Glossary</h2> |
| <div class="sectionbody"> |
| <div class="dlist"> |
| <dl> |
| <dt class="hdlist1">Application </dt> |
| <dd> |
| <p>The combination of the program running on the host and OpenCL devices.</p> |
| </dd> |
| <dt class="hdlist1">Acquire semantics </dt> |
| <dd> |
| <p>One of the memory order semantics defined for synchronization |
| operations. |
| Acquire semantics apply to atomic operations that load from memory. |
| Given two units of execution, <strong>A</strong> and <strong>B</strong>, acting on a shared atomic |
| object <strong>M</strong>, if <strong>A</strong> uses an atomic load of <strong>M</strong> with acquire semantics to |
| synchronize-with an atomic store to <strong>M</strong> by <strong>B</strong> that used release |
| semantics, then <strong>A</strong>'s atomic load will occur before any subsequent |
| operations by <strong>A</strong>. |
| Note that the memory orders <em>release</em>, <em>sequentially consistent</em>, and |
| <em>acquire_release</em> all include <em>release semantics</em> and effectively pair |
| with a load using acquire semantics.</p> |
| </dd> |
| <dt class="hdlist1">Acquire release semantics </dt> |
| <dd> |
| <p>A memory order semantics for synchronization operations (such as atomic |
| operations) that has the properties of both acquire and release memory |
| orders. |
| It is used with read-modify-write operations.</p> |
| </dd> |
| <dt class="hdlist1">Atomic operations </dt> |
| <dd> |
| <p>Operations that at any point, and from any perspective, have either |
| occurred completely, or not at all. |
| Memory orders associated with atomic operations may constrain the |
| visibility of loads and stores with respect to the atomic operations |
| (see <em>relaxed semantics</em>, <em>acquire semantics</em>, <em>release semantics</em> or |
| <em>acquire release semantics</em>).</p> |
| </dd> |
| <dt class="hdlist1">Blocking and Non-Blocking Enqueue API calls </dt> |
| <dd> |
| <p>A <em>non-blocking enqueue API call</em> places a <em>command</em> on a |
| <em>command-queue</em> and returns immediately to the host. |
| The <em>blocking-mode enqueue API calls</em> do not return to the host until |
| the command has completed.</p> |
| </dd> |
| <dt class="hdlist1">Barrier </dt> |
| <dd> |
| <p>There are three types of <em>barriers</em> a command-queue barrier, a |
| work-group barrier and a sub-group barrier.</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The OpenCL API provides a function to enqueue a <em>command-queue</em> |
| <em>barrier</em> command. |
| This <em>barrier</em> command ensures that all previously enqueued commands to |
| a command-queue have finished execution before any following <em>commands</em> |
| enqueued in the <em>command-queue</em> can begin execution.</p> |
| </li> |
| <li> |
| <p>The OpenCL kernel execution model provides built-in <em>work-group barrier</em> |
| functionality. |
| This <em>barrier</em> built-in function can be used by a <em>kernel</em> executing on |
| a <em>device</em> to perform synchronization between <em>work-items</em> in a |
| <em>work-group</em> executing the <em>kernel</em>. |
| All the <em>work-items</em> of a <em>work-group</em> must execute the <em>barrier</em> |
| construct before any are allowed to continue execution beyond the |
| <em>barrier</em>.</p> |
| </li> |
| <li> |
| <p>The OpenCL kernel execution model provides built-in <em>sub-group barrier</em> |
| functionality. |
| This <em>barrier</em> built-in function can be used by a <em>kernel</em> executing on |
| a <em>device</em> to perform synchronization between <em>work-items</em> in a |
| <em>sub-group</em> executing the <em>kernel</em>. |
| All the <em>work-items</em> of a <em>sub-group</em> must execute the <em>barrier</em> |
| construct before any are allowed to continue execution beyond the |
| <em>barrier</em>.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </dd> |
| <dt class="hdlist1">Buffer Object </dt> |
| <dd> |
| <p>A memory object that stores a linear collection of bytes. |
| Buffer objects are accessible using a pointer in a <em>kernel</em> executing on |
| a <em>device</em>. |
| Buffer objects can be manipulated by the host using OpenCL API calls. |
| A <em>buffer object</em> encapsulates the following information:</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Size in bytes.</p> |
| </li> |
| <li> |
| <p>Properties that describe usage information and which region to allocate |
| from.</p> |
| </li> |
| <li> |
| <p>Buffer data.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </dd> |
| <dt class="hdlist1">Built-in Kernel </dt> |
| <dd> |
| <p>A <em>built-in kernel</em> is a <em>kernel</em> that is executed on an OpenCL <em>device</em> |
| or <em>custom device</em> by fixed-function hardware or in firmware. |
| <em>Applications</em> can query the <em>built-in kernels</em> supported by a <em>device</em> |
| or <em>custom device</em>. |
| A <em>program object</em> can only contain <em>kernels</em> written in OpenCL C or |
| <em>built-in kernels</em> but not both. |
| See also <em>Kernel</em> and <em>Program</em>.</p> |
| </dd> |
| <dt class="hdlist1">Child kernel </dt> |
| <dd> |
| <p>See <em>Device-side enqueue</em>.</p> |
| </dd> |
| <dt class="hdlist1">Command </dt> |
| <dd> |
| <p>The OpenCL operations that are submitted to a <em>command-queue</em> for |
| execution. |
| For example, OpenCL commands issue kernels for execution on a compute |
| device, manipulate memory objects, etc.</p> |
| </dd> |
| <dt class="hdlist1">Command-queue </dt> |
| <dd> |
| <p>An object that holds <em>commands</em> that will be executed on a specific |
| <em>device</em>. |
| The <em>command-queue</em> is created on a specific <em>device</em> in a <em>context</em>. |
| <em>Commands</em> to a <em>command-queue</em> are queued in-order but may be executed |
| in-order or out-of-order. |
| <em>Refer to In-order Execution_and_Out-of-order Execution</em>.</p> |
| </dd> |
| <dt class="hdlist1">Command-queue Barrier </dt> |
| <dd> |
| <p>See <em>Barrier</em>.</p> |
| </dd> |
| <dt class="hdlist1">Command synchronization </dt> |
| <dd> |
| <p>Constraints on the order that commands are launched for execution on a |
| device defined in terms of the synchronization points that occur between |
| commands in host command-queues and between commands in device-side |
| command-queues. |
| See <em>synchronization points</em>.</p> |
| </dd> |
| <dt class="hdlist1">Complete </dt> |
| <dd> |
| <p>The final state in the six state model for the execution of a command. |
| The transition into this state occurs is signaled through event objects |
| or callback functions associated with a command.</p> |
| </dd> |
| <dt class="hdlist1">Compute Device Memory </dt> |
| <dd> |
| <p>This refers to one or more memories attached to the compute device.</p> |
| </dd> |
| <dt class="hdlist1">Compute Unit </dt> |
| <dd> |
| <p>An OpenCL <em>device</em> has one or more <em>compute units</em>. |
| A <em>work-group</em> executes on a single <em>compute unit</em>. |
| A <em>compute unit</em> is composed of one or more <em>processing elements</em> and |
| <em>local memory</em>. |
| A <em>compute unit</em> may also include dedicated texture filter units that |
| can be accessed by its processing elements.</p> |
| </dd> |
| <dt class="hdlist1">Concurrency </dt> |
| <dd> |
| <p>A property of a system in which a set of tasks in a system can remain |
| active and make progress at the same time. |
| To utilize concurrent execution when running a program, a programmer |
| must identify the concurrency in their problem, expose it within the |
| source code, and then exploit it using a notation that supports |
| concurrency.</p> |
| </dd> |
| <dt class="hdlist1">Constant Memory </dt> |
| <dd> |
| <p>A region of <em>global memory</em> that remains constant during the execution |
| of a <em>kernel</em>. |
| The <em>host</em> allocates and initializes memory objects placed into |
| <em>constant memory</em>.</p> |
| </dd> |
| <dt class="hdlist1">Context </dt> |
| <dd> |
| <p>The environment within which the kernels execute and the domain in which |
| synchronization and memory management is defined. |
| The <em>context</em> includes a set of <em>devices</em>, the memory accessible to |
| those <em>devices</em>, the corresponding memory properties and one or more |
| <em>command-queues</em> used to schedule execution of a <em>kernel(s)</em> or |
| operations on <em>memory objects</em>.</p> |
| </dd> |
| <dt class="hdlist1">Control flow </dt> |
| <dd> |
| <p>The flow of instructions executed by a work-item. |
| Multiple logically related work-items may or may not execute the same |
| control flow. |
| The control flow is said to be <em>converged</em> if all the work-items in the |
| set execution the same stream of instructions. |
| In a <em>diverged</em> control flow, the work-items in the set execute |
| different instructions. |
| At a later point, if a diverged control flow becomes converged, it is |
| said to be a re-converged control flow.</p> |
| </dd> |
| <dt class="hdlist1">Converged control flow </dt> |
| <dd> |
| <p>See <em>Control flow</em>.</p> |
| </dd> |
| <dt class="hdlist1">Custom Device </dt> |
| <dd> |
| <p>An OpenCL <em>device</em> that fully implements the OpenCL Runtime but does not |
| support <em>programs</em> written in OpenCL C. |
| A custom device may be specialized non-programmable hardware that is |
| very power efficient and performant for directed tasks or hardware with |
| limited programmable capabilities such as specialized DSPs. |
| Custom devices are not OpenCL conformant. |
| Custom devices may support an online compiler. |
| Programs for custom devices can be created using the OpenCL runtime APIs |
| that allow OpenCL programs to be created from source (if an online |
| compiler is supported) and/or binary, or from <em>built-in kernels</em> |
| supported by the <em>device</em>. |
| See also <em>Device</em>.</p> |
| </dd> |
| <dt class="hdlist1">Data Parallel Programming Model </dt> |
| <dd> |
| <p>Traditionally, this term refers to a programming model where concurrency |
| is expressed as instructions from a single program applied to multiple |
| elements within a set of data structures. |
| The term has been generalized in OpenCL to refer to a model wherein a |
| set of instructions from a single program are applied concurrently to |
| each point within an abstract domain of indices.</p> |
| </dd> |
| <dt class="hdlist1">Data race </dt> |
| <dd> |
| <p>The execution of a program contains a data race if it contains two |
| actions in different work-items or host threads where (1) one action |
| modifies a memory location and the other action reads or modifies the |
| same memory location, and (2) at least one of these actions is not |
| atomic, or the corresponding memory scopes are not inclusive, and (3) |
| the actions are global actions unordered by the global-happens-before |
| relation or are local actions unordered by the local-happens before |
| relation.</p> |
| </dd> |
| <dt class="hdlist1">Deprecation </dt> |
| <dd> |
| <p>Existing features are marked as deprecated if their usage is not |
| recommended as that feature is being de-emphasized, superseded and may |
| be removed from a future version of the specification.</p> |
| </dd> |
| <dt class="hdlist1">Device </dt> |
| <dd> |
| <p>A <em>device</em> is a collection of <em>compute units</em>. |
| A <em>command-queue</em> is used to queue <em>commands</em> to a <em>device</em>. |
| Examples of <em>commands</em> include executing <em>kernels</em>, or reading and |
| writing <em>memory objects</em>. |
| OpenCL devices typically correspond to a GPU, a multi-core CPU, and |
| other processors such as DSPs and the Cell/B.E. |
| processor.</p> |
| </dd> |
| <dt class="hdlist1">Device-side enqueue </dt> |
| <dd> |
| <p>A mechanism whereby a kernel-instance is enqueued by a kernel-instance |
| running on a device without direct involvement by the host program. |
| This produces <em>nested parallelism</em>; i.e. additional levels of |
| concurrency are nested inside a running kernel-instance. |
| The kernel-instance executing on a device (the <em>parent kernel</em>) enqueues |
| a kernel-instance (the <em>child kernel</em>) to a device-side command queue. |
| Child and parent kernels execute asynchronously though a parent kernel |
| does not complete until all of its child-kernels have completed.</p> |
| </dd> |
| <dt class="hdlist1">Diverged control flow </dt> |
| <dd> |
| <p>See <em>Control flow</em>.</p> |
| </dd> |
| <dt class="hdlist1">Ended </dt> |
| <dd> |
| <p>The fifth state in the six state model for the execution of a command. |
| The transition into this state occurs when execution of a command has |
| ended. |
| When a Kernel-enqueue command ends, all of the work-groups associated |
| with that command have finished their execution.</p> |
| </dd> |
| <dt class="hdlist1">Event Object </dt> |
| <dd> |
| <p>An <em>event object</em> encapsulates the status of an operation such as a |
| <em>command</em>. |
| It can be used to synchronize operations in a context.</p> |
| </dd> |
| <dt class="hdlist1">Event Wait List </dt> |
| <dd> |
| <p>An <em>event wait list</em> is a list of <em>event objects</em> that can be used to |
| control when a particular <em>command</em> begins execution.</p> |
| </dd> |
| <dt class="hdlist1">Fence </dt> |
| <dd> |
| <p>A memory ordering operation without an associated atomic object. |
| A fence can use the <em>acquire semantics, release semantics</em>, or <em>acquire |
| release semantics</em>.</p> |
| </dd> |
| <dt class="hdlist1">Framework </dt> |
| <dd> |
| <p>A software system that contains the set of components to support |
| software development and execution. |
| A <em>framework</em> typically includes libraries, APIs, runtime systems, |
| compilers, etc.</p> |
| </dd> |
| <dt class="hdlist1">Generic address space </dt> |
| <dd> |
| <p>An address space that include the <em>private</em>, <em>local</em>, and <em>global</em> |
| address spaces available to a device. |
| The generic address space supports conversion of pointers to and from |
| private, local and global address spaces, and hence lets a programmer |
| write a single function that at compile time can take arguments from any |
| of the three named address spaces.</p> |
| </dd> |
| <dt class="hdlist1">Global Happens before </dt> |
| <dd> |
| <p>See <em>Happens before</em>.</p> |
| </dd> |
| <dt class="hdlist1">Global ID </dt> |
| <dd> |
| <p>A <em>global ID</em> is used to uniquely identify a <em>work-item</em> and is derived |
| from the number of <em>global work-items</em> specified when executing a |
| <em>kernel</em>. |
| The <em>global ID</em> is a N-dimensional value that starts at (0, 0, …​ 0). |
| See also <em>Local ID</em>.</p> |
| </dd> |
| <dt class="hdlist1">Global Memory </dt> |
| <dd> |
| <p>A memory region accessible to all <em>work-items</em> executing in a <em>context</em>. |
| It is accessible to the <em>host</em> using <em>commands</em> such as read, write and |
| map. |
| <em>Global memory</em> is included within the <em>generic address space</em> that |
| includes the private and local address spaces.</p> |
| </dd> |
| <dt class="hdlist1">GL share group </dt> |
| <dd> |
| <p>A <em>GL share group</em> object manages shared OpenGL or OpenGL ES resources |
| such as textures, buffers, framebuffers, and renderbuffers and is |
| associated with one or more GL context objects. |
| The <em>GL share group</em> is typically an opaque object and not directly |
| accessible.</p> |
| </dd> |
| <dt class="hdlist1">Handle </dt> |
| <dd> |
| <p>An opaque type that references an <em>object</em> allocated by OpenCL. |
| Any operation on an <em>object</em> occurs by reference to that objects handle.</p> |
| </dd> |
| <dt class="hdlist1">Happens before </dt> |
| <dd> |
| <p>An ordering relationship between operations that execute on multiple |
| units of execution. |
| If an operation A happens-before operation B then A must occur before B; |
| in particular, any value written by A will be visible to B. |
| We define two separate happens before relations: <em>global-happens-before</em> |
| and <em>local-happens-before</em>. |
| These are defined in <a href="#memory-ordering-rules">Memory Ordering Rules</a>.</p> |
| </dd> |
| <dt class="hdlist1">Host </dt> |
| <dd> |
| <p>The <em>host</em> interacts with the <em>context</em> using the OpenCL API.</p> |
| </dd> |
| <dt class="hdlist1">Host-thread </dt> |
| <dd> |
| <p>The unit of execution that executes the statements in the host program.</p> |
| </dd> |
| <dt class="hdlist1">Host pointer </dt> |
| <dd> |
| <p>A pointer to memory that is in the virtual address space on the <em>host</em>.</p> |
| </dd> |
| <dt class="hdlist1">Illegal </dt> |
| <dd> |
| <p>Behavior of a system that is explicitly not allowed and will be reported |
| as an error when encountered by OpenCL.</p> |
| </dd> |
| <dt class="hdlist1">Image Object </dt> |
| <dd> |
| <p>A <em>memory object</em> that stores a two- or three-dimensional structured |
| array. |
| Image data can only be accessed with read and write functions. |
| The read functions use a <em>sampler</em>.</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The <em>image object</em> encapsulates the following information:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Dimensions of the image.</p> |
| </li> |
| <li> |
| <p>Description of each element in the image.</p> |
| </li> |
| <li> |
| <p>Properties that describe usage information and which region to allocate |
| from.</p> |
| </li> |
| <li> |
| <p>Image data.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The elements of an image are selected from a list of predefined image |
| formats.</p> |
| </div> |
| </div> |
| </div> |
| </dd> |
| <dt class="hdlist1">Implementation Defined </dt> |
| <dd> |
| <p>Behavior that is explicitly allowed to vary between conforming |
| implementations of OpenCL. |
| An OpenCL implementor is required to document the implementation-defined |
| behavior.</p> |
| </dd> |
| <dt class="hdlist1">Independent Forward Progress </dt> |
| <dd> |
| <p>If an entity supports independent forward progress, then if it is |
| otherwise not dependent on any actions due to be performed by any other |
| entity (for example it does not wait on a lock held by, and thus that |
| must be released by, any other entity), then its execution cannot be |
| blocked by the execution of any other entity in the system (it will not |
| be starved). |
| Work-items in a subgroup, for example, typically do not support |
| independent forward progress, so one work-item in a subgroup may be |
| completely blocked (starved) if a different work-item in the same |
| subgroup enters a spin loop.</p> |
| </dd> |
| <dt class="hdlist1">In-order Execution </dt> |
| <dd> |
| <p>A model of execution in OpenCL where the <em>commands</em> in a <em>command-queue</em> |
| are executed in order of submission with each <em>command</em> running to |
| completion before the next one begins. |
| See Out-of-order Execution.</p> |
| </dd> |
| <dt class="hdlist1">Intermediate Language </dt> |
| <dd> |
| <p>A lower-level language that may be used to create programs. |
| SPIR-V is a required intermediate language (IL) for OpenCL 2.1 and 2.2 devices. |
| Other OpenCL devices may optionally support SPIR-V or other ILs.</p> |
| </dd> |
| <dt class="hdlist1">Kernel </dt> |
| <dd> |
| <p>A <em>kernel</em> is a function declared in a <em>program</em> and executed on an |
| OpenCL <em>device</em>. |
| A <em>kernel</em> is identified by the <code>__kernel</code> or <code>kernel</code> qualifier applied to |
| any function defined in a <em>program</em>.</p> |
| </dd> |
| <dt class="hdlist1">Kernel-instance </dt> |
| <dd> |
| <p>The work carried out by an OpenCL program occurs through the execution |
| of kernel-instances on devices. |
| The kernel instance is the <em>kernel object</em>, the values associated with |
| the arguments to the kernel, and the parameters that define the |
| <em>NDRange</em> index space.</p> |
| </dd> |
| <dt class="hdlist1">Kernel Object </dt> |
| <dd> |
| <p>A <em>kernel object</em> encapsulates a specific <em>kernel</em> function declared |
| in a <em>program</em> and the argument values to be used when executing this |
| <em>kernel</em> function.</p> |
| </dd> |
| <dt class="hdlist1">Kernel Language </dt> |
| <dd> |
| <p>A language that is used to represent source code for kernel. |
| Kernels may be directly created from OpenCL C kernel language |
| source strings. |
| Other kernel languages may be supported by compiling to SPIR-V, |
| another supported Intermediate Language, or to a device-specific |
| program binary format.</p> |
| </dd> |
| <dt class="hdlist1">Launch </dt> |
| <dd> |
| <p>The transition of a command from the <em>submitted</em> state to the <em>ready</em> |
| state. |
| See <em>Ready</em>.</p> |
| </dd> |
| <dt class="hdlist1">Local ID </dt> |
| <dd> |
| <p>A <em>local ID</em> specifies a unique <em>work-item ID</em> within a given |
| <em>work-group</em> that is executing a <em>kernel</em>. |
| The <em>local ID</em> is a N-dimensional value that starts at (0, 0, …​ 0). |
| See also <em>Global ID</em>.</p> |
| </dd> |
| <dt class="hdlist1">Local Memory </dt> |
| <dd> |
| <p>A memory region associated with a <em>work-group</em> and accessible only by |
| <em>work-items</em> in that <em>work-group</em>. |
| <em>Local memory</em> is included within the <em>generic address space</em> that |
| includes the private and global address spaces.</p> |
| </dd> |
| <dt class="hdlist1">Marker </dt> |
| <dd> |
| <p>A <em>command</em> queued in a <em>command-queue</em> that can be used to tag all |
| <em>commands</em> queued before the <em>marker</em> in the <em>command-queue</em>. |
| The <em>marker</em> command returns an <em>event</em> which can be used by the |
| <em>application</em> to queue a wait on the marker event i.e. wait for all |
| commands queued before the <em>marker</em> command to complete.</p> |
| </dd> |
| <dt class="hdlist1">Memory Consistency Model </dt> |
| <dd> |
| <p>Rules that define which values are observed when multiple units of |
| execution load data from any shared memory plus the synchronization |
| operations that constrain the order of memory operations and define |
| synchronization relationships. |
| The memory consistency model in OpenCL is based on the memory model from |
| the ISO C11 programming language.</p> |
| </dd> |
| <dt class="hdlist1">Memory Objects </dt> |
| <dd> |
| <p>A <em>memory object</em> is a handle to a reference counted region of <em>Global |
| Memory</em>. |
| Also see <em>Buffer Object</em> and <em>Image Object</em>.</p> |
| </dd> |
| <dt class="hdlist1">Memory Regions (or Pools) </dt> |
| <dd> |
| <p>A distinct address space in OpenCL. |
| <em>Memory regions</em> may overlap in physical memory though OpenCL will treat |
| them as logically distinct. |
| The <em>memory regions</em> are denoted as <em>private</em>, <em>local</em>, <em>constant,</em> and |
| <em>global</em>.</p> |
| </dd> |
| <dt class="hdlist1">Memory Scopes </dt> |
| <dd> |
| <p>These memory scopes define a hierarchy of visibilities when analyzing |
| the ordering constraints of memory operations. |
| They are defined by the values of the <strong>memory_scope</strong> enumeration |
| constant. |
| Current values are <strong>memory_scope_work_item</strong> (memory constraints only |
| apply to a single work-item and in practice apply only to image |
| operations), <strong>memory_scope_sub_group</strong> (memory-ordering constraints only |
| apply to work-items executing in a sub-group), <strong>memory_scope_work_group</strong> |
| (memory-ordering constraints only apply to work-items executing in a |
| work-group), <strong>memory_scope_device</strong> (memory-ordering constraints only |
| apply to work-items executing on a single device) and |
| <strong>memory_scope_all_svm_devices</strong> (memory-ordering constraints only apply |
| to work-items executing across multiple devices and when using shared |
| virtual memory).</p> |
| </dd> |
| <dt class="hdlist1">Modification Order </dt> |
| <dd> |
| <p>All modifications to a particular atomic object M occur in some |
| particular <em>total order</em>, called the <em>modification order</em> of M. |
| If A and B are modifications of an atomic object M, and A happens-before |
| B, then A shall precede B in the modification order of M. |
| Note that the modification order of an atomic object M is independent of |
| whether M is in local or global memory.</p> |
| </dd> |
| <dt class="hdlist1">Nested Parallelism </dt> |
| <dd> |
| <p>See <em>device-side enqueue</em>.</p> |
| </dd> |
| <dt class="hdlist1">Object </dt> |
| <dd> |
| <p>Objects are abstract representation of the resources that can be |
| manipulated by the OpenCL API. |
| Examples include <em>program objects</em>, <em>kernel objects</em>, and <em>memory |
| objects</em>.</p> |
| </dd> |
| <dt class="hdlist1">Out-of-Order Execution </dt> |
| <dd> |
| <p>A model of execution in which <em>commands</em> placed in the <em>work queue</em> may |
| begin and complete execution in any order consistent with constraints |
| imposed by <em>event wait lists_and_command-queue barrier</em>. |
| See <em>In-order Execution</em>.</p> |
| </dd> |
| <dt class="hdlist1">Parent device </dt> |
| <dd> |
| <p>The OpenCL <em>device</em> which is partitioned to create <em>sub-devices</em>. |
| Not all <em>parent devices</em> are <em>root devices</em>. |
| A <em>root device</em> might be partitioned and the <em>sub-devices</em> partitioned |
| again. |
| In this case, the first set of <em>sub-devices</em> would be <em>parent devices</em> |
| of the second set, but not the <em>root devices</em>. |
| Also see <em>Device</em>, <em>parent device</em> and <em>root device</em>.</p> |
| </dd> |
| <dt class="hdlist1">Parent kernel </dt> |
| <dd> |
| <p>see <em>Device-side enqueue</em>.</p> |
| </dd> |
| <dt class="hdlist1">Pipe </dt> |
| <dd> |
| <p>The <em>pipe</em> memory object conceptually is an ordered sequence of data |
| items. |
| A pipe has two endpoints: a write endpoint into which data items are |
| inserted, and a read endpoint from which data items are removed. |
| At any one time, only one kernel instance may write into a pipe, and |
| only one kernel instance may read from a pipe. |
| To support the producer consumer design pattern, one kernel instance |
| connects to the write endpoint (the producer) while another kernel |
| instance connects to the reading endpoint (the consumer).</p> |
| </dd> |
| <dt class="hdlist1">Platform </dt> |
| <dd> |
| <p>The <em>host</em> plus a collection of <em>devices</em> managed by the OpenCL |
| <em>framework</em> that allow an application to share <em>resources</em> and execute |
| <em>kernels</em> on <em>devices</em> in the <em>platform</em>.</p> |
| </dd> |
| <dt class="hdlist1">Private Memory </dt> |
| <dd> |
| <p>A region of memory private to a <em>work-item</em>. |
| Variables defined in one <em>work-items</em> <em>private memory</em> are not visible |
| to another <em>work-item</em>.</p> |
| </dd> |
| <dt class="hdlist1">Processing Element </dt> |
| <dd> |
| <p>A virtual scalar processor. |
| A work-item may execute on one or more processing elements.</p> |
| </dd> |
| <dt class="hdlist1">Program </dt> |
| <dd> |
| <p>An OpenCL <em>program</em> consists of a set of <em>kernels</em>. |
| <em>Programs</em> may also contain auxiliary functions called by the |
| <em>kernel</em> functions and constant data.</p> |
| </dd> |
| <dt class="hdlist1">Program Object </dt> |
| <dd> |
| <p>A <em>program object</em> encapsulates the following information:</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>A reference to an associated <em>context</em>.</p> |
| </li> |
| <li> |
| <p>A <em>program</em> source or binary.</p> |
| </li> |
| <li> |
| <p>The latest successfully built program executable, the list of <em>devices</em> |
| for which the program executable is built, the build options used and a |
| build log.</p> |
| </li> |
| <li> |
| <p>The number of <em>kernel objects</em> currently attached.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </dd> |
| <dt class="hdlist1">Queued </dt> |
| <dd> |
| <p>The first state in the six state model for the execution of a command. |
| The transition into this state occurs when the command is enqueued into |
| a command-queue.</p> |
| </dd> |
| <dt class="hdlist1">Ready </dt> |
| <dd> |
| <p>The third state in the six state model for the execution of a command. |
| The transition into this state occurs when pre-requisites constraining |
| execution of a command have been met; i.e. the command has been |
| launched. |
| When a kernel-enqueue command is launched, work-groups associated with |
| the command are placed in a devices work-pool from which they are |
| scheduled for execution.</p> |
| </dd> |
| <dt class="hdlist1">Re-converged Control Flow </dt> |
| <dd> |
| <p>see <em>Control flow</em>.</p> |
| </dd> |
| <dt class="hdlist1">Reference Count </dt> |
| <dd> |
| <p>The life span of an OpenCL object is determined by its <em>reference |
| count</em>, an internal count of the number of references to the object. |
| When you create an object in OpenCL, its <em>reference count</em> is set to |
| one. |
| Subsequent calls to the appropriate <em>retain</em> API (such as |
| <a href="#clRetainContext"><strong>clRetainContext</strong></a>, <a href="#clRetainCommandQueue"><strong>clRetainCommandQueue</strong></a>) increment the <em>reference |
| count</em>. |
| Calls to the appropriate <em>release</em> API (such as <a href="#clReleaseContext"><strong>clReleaseContext</strong></a>, |
| <a href="#clReleaseCommandQueue"><strong>clReleaseCommandQueue</strong></a>) decrement the <em>reference count</em>. |
| Implementations may also modify the <em>reference count</em>, e.g. to track |
| attached objects or to ensure correct operation of in-progress or |
| scheduled activities. |
| The object becomes inaccessible to host code when the number of |
| <em>release</em> operations performed matches the number of <em>retain</em> operations |
| plus the allocation of the object. |
| At this point the reference count may be zero but this is not |
| guaranteed.</p> |
| </dd> |
| <dt class="hdlist1">Relaxed Consistency </dt> |
| <dd> |
| <p>A memory consistency model in which the contents of memory visible to |
| different <em>work-items</em> or <em>commands</em> may be different except at a |
| <em>barrier</em> or other explicit synchronization points.</p> |
| </dd> |
| <dt class="hdlist1">Relaxed Semantics </dt> |
| <dd> |
| <p>A memory order semantics for atomic operations that implies no order |
| constraints. |
| The operation is <em>atomic</em> but it has no impact on the order of memory |
| operations.</p> |
| </dd> |
| <dt class="hdlist1">Release Semantics </dt> |
| <dd> |
| <p>One of the memory order semantics defined for synchronization |
| operations. |
| Release semantics apply to atomic operations that store to memory. |
| Given two units of execution, <strong>A</strong> and <strong>B</strong>, acting on a shared atomic |
| object <strong>M</strong>, if <strong>A</strong> uses an atomic store of <strong>M</strong> with release semantics to |
| synchronize-with an atomic load to <strong>M</strong> by <strong>B</strong> that used acquire |
| semantics, then <strong>A</strong>'s atomic store will occur <em>after</em> any prior |
| operations by <strong>A</strong>. |
| Note that the memory orders <em>acquire</em>, <em>sequentially consistent</em>, and |
| <em>acquire_release</em> all include <em>acquire semantics</em> and effectively pair |
| with a store using release semantics.</p> |
| </dd> |
| <dt class="hdlist1">Remainder work-groups </dt> |
| <dd> |
| <p>When the work-groups associated with a kernel-instance are defined, the |
| sizes of a work-group in each dimension may not evenly divide the size |
| of the NDRange in the corresponding dimensions. |
| The result is a collection of work-groups on the boundaries of the |
| NDRange that are smaller than the base work-group size. |
| These are known as <em>remainder work-groups</em>.</p> |
| </dd> |
| <dt class="hdlist1">Running </dt> |
| <dd> |
| <p>The fourth state in the six state model for the execution of a command. |
| The transition into this state occurs when the execution of the command |
| starts. |
| When a Kernel-enqueue command starts, one or more work-groups associated |
| with the command start to execute.</p> |
| </dd> |
| <dt class="hdlist1">Root device </dt> |
| <dd> |
| <p>A <em>root device</em> is an OpenCL <em>device</em> that has not been partitioned. |
| Also see <em>Device</em>, <em>Parent device</em> and <em>Root device</em>.</p> |
| </dd> |
| <dt class="hdlist1">Resource </dt> |
| <dd> |
| <p>A class of <em>objects</em> defined by OpenCL. |
| An instance of a <em>resource</em> is an <em>object</em>. |
| The most common <em>resources</em> are the <em>context</em>, <em>command-queue</em>, <em>program |
| objects</em>, <em>kernel objects</em>, and <em>memory objects</em>. |
| Computational resources are hardware elements that participate in the |
| action of advancing a program counter. |
| Examples include the <em>host</em>, <em>devices</em>, <em>compute units</em> and <em>processing |
| elements</em>.</p> |
| </dd> |
| <dt class="hdlist1">Retain, Release </dt> |
| <dd> |
| <p>The action of incrementing (retain) and decrementing (release) the |
| reference count using an OpenCL <em>object</em>. |
| This is a book keeping functionality to make sure the system doesn’t |
| remove an <em>object</em> before all instances that use this <em>object</em> have |
| finished. |
| Refer to <em>Reference Count</em>.</p> |
| </dd> |
| <dt class="hdlist1">Sampler </dt> |
| <dd> |
| <p>An <em>object</em> that describes how to sample an image when the image is read |
| in the <em>kernel</em>. |
| The image read functions take a <em>sampler</em> as an argument. |
| The <em>sampler</em> specifies the image addressing-mode i.e. how out-of-range |
| image coordinates are handled, the filter mode, and whether the input |
| image coordinate is a normalized or unnormalized value.</p> |
| </dd> |
| <dt class="hdlist1">Scope inclusion </dt> |
| <dd> |
| <p>Two actions <strong>A</strong> and <strong>B</strong> are defined to have an inclusive scope if they |
| have the same scope <strong>P</strong> such that: (1) if <strong>P</strong> is |
| <strong>memory_scope_sub_group</strong>, and <strong>A</strong> and <strong>B</strong> are executed by work-items |
| within the same sub-group, or (2) if <strong>P</strong> is <strong>memory_scope_work_group</strong>, |
| and <strong>A</strong> and <strong>B</strong> are executed by work-items within the same work-group, |
| or (3) if <strong>P</strong> is <strong>memory_scope_device</strong>, and <strong>A</strong> and <strong>B</strong> are executed by |
| work-items on the same device, or (4) if <strong>P</strong> is |
| <strong>memory_scope_all_svm_devices</strong>, if <strong>A</strong> and <strong>B</strong> are executed by host |
| threads or by work-items on one or more devices that can share SVM |
| memory with each other and the host process.</p> |
| </dd> |
| <dt class="hdlist1">Sequenced before </dt> |
| <dd> |
| <p>A relation between evaluations executed by a single unit of execution. |
| Sequenced-before is an asymmetric, transitive, pair-wise relation that |
| induces a partial order between evaluations. |
| Given any two evaluations A and B, if A is sequenced-before B, then the |
| execution of A shall precede the execution of B.</p> |
| </dd> |
| <dt class="hdlist1">Sequential consistency </dt> |
| <dd> |
| <p>Sequential consistency interleaves the steps executed by each unit of |
| execution. |
| Each access to a memory location sees the last assignment to that |
| location in that interleaving.</p> |
| </dd> |
| <dt class="hdlist1">Sequentially consistent semantics </dt> |
| <dd> |
| <p>One of the memory order semantics defined for synchronization |
| operations. |
| When using sequentially-consistent synchronization operations, the loads |
| and stores within one unit of execution appear to execute in program |
| order (i.e., the sequenced-before order), and loads and stores from |
| different units of execution appear to be simply interleaved.</p> |
| </dd> |
| <dt class="hdlist1">Shared Virtual Memory (SVM) </dt> |
| <dd> |
| <p>An address space exposed to both the host and the devices within a |
| context. |
| SVM causes addresses to be meaningful between the host and all of the |
| devices within a context and therefore supports the use of pointer based |
| data structures in OpenCL kernels. |
| It logically extends a portion of the global memory into the host |
| address space therefore giving work-items access to the host address |
| space. |
| There are three types of SVM in OpenCL:</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="dlist"> |
| <dl> |
| <dt class="hdlist1"><em>Coarse-Grained buffer SVM</em> </dt> |
| <dd> |
| <p>Sharing occurs at the granularity of regions of OpenCL buffer memory |
| objects.</p> |
| </dd> |
| <dt class="hdlist1"><em>Fine-Grained buffer SVM</em> </dt> |
| <dd> |
| <p>Sharing occurs at the granularity of individual loads/stores into bytes |
| within OpenCL buffer memory objects.</p> |
| </dd> |
| <dt class="hdlist1"><em>Fine-Grained system SVM</em> </dt> |
| <dd> |
| <p>Sharing occurs at the granularity of individual loads/stores into bytes |
| occurring anywhere within the host memory.</p> |
| </dd> |
| </dl> |
| </div> |
| </div> |
| </div> |
| </dd> |
| <dt class="hdlist1">SIMD </dt> |
| <dd> |
| <p>Single Instruction Multiple Data. |
| A programming model where a <em>kernel</em> is executed concurrently on |
| multiple <em>processing elements</em> each with its own data and a shared |
| program counter. |
| All <em>processing elements</em> execute a strictly identical set of |
| instructions.</p> |
| </dd> |
| <dt class="hdlist1">Specialization constants </dt> |
| <dd> |
| <p>Specialization constants are special constant objects that do not |
| have known constant values in an intermediate language (e.g. SPIR-V). |
| Applications may provide updated values for the specialization constants |
| before a program is built. |
| Specialization constants that do not receive a value from an application |
| shall use the default specialization constant value.</p> |
| </dd> |
| <dt class="hdlist1">SPMD </dt> |
| <dd> |
| <p>Single Program Multiple Data. |
| A programming model where a <em>kernel</em> is executed concurrently on |
| multiple <em>processing elements</em> each with its own data and its own |
| program counter. |
| Hence, while all computational resources run the same <em>kernel</em> they |
| maintain their own instruction counter and due to branches in a |
| <em>kernel</em>, the actual sequence of instructions can be quite different |
| across the set of <em>processing elements</em>.</p> |
| </dd> |
| <dt class="hdlist1">Sub-device </dt> |
| <dd> |
| <p>An OpenCL <em>device</em> can be partitioned into multiple <em>sub-devices</em>. |
| The new <em>sub-devices</em> alias specific collections of compute units within |
| the parent <em>device</em>, according to a partition scheme. |
| The <em>sub-devices</em> may be used in any situation that their parent |
| <em>device</em> may be used. |
| Partitioning a <em>device</em> does not destroy the parent <em>device</em>, which may |
| continue to be used along side and intermingled with its child |
| <em>sub-devices</em>. |
| Also see <em>Device</em>, <em>Parent device</em> and <em>Root device</em>.</p> |
| </dd> |
| <dt class="hdlist1">Sub-group </dt> |
| <dd> |
| <p>Sub-groups are an implementation-dependent grouping of work-items within |
| a work-group. |
| The size and number of sub-groups is implementation-defined.</p> |
| </dd> |
| <dt class="hdlist1">Sub-group Barrier </dt> |
| <dd> |
| <p>See <em>Barrier</em>.</p> |
| </dd> |
| <dt class="hdlist1">Submitted </dt> |
| <dd> |
| <p>The second state in the six state model for the execution of a command. |
| The transition into this state occurs when the command is flushed from |
| the command-queue and submitted for execution on the device. |
| Once submitted, a programmer can assume a command will execute once its |
| prerequisites have been met.</p> |
| </dd> |
| <dt class="hdlist1">SVM Buffer </dt> |
| <dd> |
| <p>A memory allocation enabled to work with <em>Shared Virtual Memory (SVM)</em>. |
| Depending on how the SVM buffer is created, it can be a coarse-grained |
| or fine-grained SVM buffer. |
| Optionally it may be wrapped by a <em>Buffer Object</em>. |
| See <em>Shared Virtual Memory (SVM)</em>.</p> |
| </dd> |
| <dt class="hdlist1">Synchronization </dt> |
| <dd> |
| <p>Synchronization refers to mechanisms that constrain the order of |
| execution and the visibility of memory operations between two or more |
| units of execution.</p> |
| </dd> |
| <dt class="hdlist1">Synchronization operations </dt> |
| <dd> |
| <p>Operations that define memory order constraints in a program. |
| They play a special role in controlling how memory operations in one |
| unit of execution (such as work-items or, when using SVM a host thread) |
| are made visible to another. |
| Synchronization operations in OpenCL include <em>atomic operations</em> and |
| <em>fences</em>.</p> |
| </dd> |
| <dt class="hdlist1">Synchronization point </dt> |
| <dd> |
| <p>A synchronization point between a pair of commands (A and B) assures |
| that results of command A happens-before command B is launched (i.e. |
| enters the ready state) .</p> |
| </dd> |
| <dt class="hdlist1">Synchronizes with </dt> |
| <dd> |
| <p>A relation between operations in two different units of execution that |
| defines a memory order constraint in global memory |
| (<em>global-synchronizes-with</em>) or local memory |
| (<em>local-synchronizes-with</em>).</p> |
| </dd> |
| <dt class="hdlist1">Task Parallel Programming Model </dt> |
| <dd> |
| <p>A programming model in which computations are expressed in terms of |
| multiple concurrent tasks executing in one or more <em>command-queues</em>. |
| The concurrent tasks can be running different <em>kernels</em>.</p> |
| </dd> |
| <dt class="hdlist1">Thread-safe </dt> |
| <dd> |
| <p>An OpenCL API call is considered to be <em>thread-safe</em> if the internal |
| state as managed by OpenCL remains consistent when called simultaneously |
| by multiple <em>host</em> threads. |
| OpenCL API calls that are <em>thread-safe</em> allow an application to call |
| these functions in multiple <em>host</em> threads without having to implement |
| mutual exclusion across these <em>host</em> threads i.e. they are also |
| re-entrant-safe.</p> |
| </dd> |
| <dt class="hdlist1">Undefined </dt> |
| <dd> |
| <p>The behavior of an OpenCL API call, built-in function used inside a |
| <em>kernel</em> or execution of a <em>kernel</em> that is explicitly not defined by |
| OpenCL. |
| A conforming implementation is not required to specify what occurs when |
| an undefined construct is encountered in OpenCL.</p> |
| </dd> |
| <dt class="hdlist1">Unit of execution </dt> |
| <dd> |
| <p>A generic term for a process, OS managed thread running on the host (a |
| host-thread), kernel-instance, host program, work-item or any other |
| executable agent that advances the work associated with a program.</p> |
| </dd> |
| <dt class="hdlist1">Work-group </dt> |
| <dd> |
| <p>A collection of related <em>work-items</em> that execute on a single <em>compute |
| unit</em>. |
| The <em>work-items</em> in the group execute the same <em>kernel-instance</em> and |
| share <em>local</em> <em>memory</em> and <em>work-group functions</em>.</p> |
| </dd> |
| <dt class="hdlist1">Work-group Barrier </dt> |
| <dd> |
| <p>See <em>Barrier</em>.</p> |
| </dd> |
| <dt class="hdlist1">Work-group Function </dt> |
| <dd> |
| <p>A function that carries out collective operations across all the |
| work-items in a work-group. |
| Available collective operations are a barrier, reduction, broadcast, |
| prefix sum, and evaluation of a predicate. |
| A work-group function must occur within a <em>converged control flow</em>; i.e. |
| all work-items in the work-group must encounter precisely the same |
| work-group function.</p> |
| </dd> |
| <dt class="hdlist1">Work-group Synchronization </dt> |
| <dd> |
| <p>Constraints on the order of execution for work-items in a single |
| work-group.</p> |
| </dd> |
| <dt class="hdlist1">Work-pool </dt> |
| <dd> |
| <p>A logical pool associated with a device that holds commands and |
| work-groups from kernel-instances that are ready to execute. |
| OpenCL does not constrain the order that commands and work-groups are |
| scheduled for execution from the work-pool; i.e. a programmer must |
| assume that they could be interleaved. |
| There is one work-pool per device used by all command-queues associated |
| with that device. |
| The work-pool may be implemented in any manner as long as it assures |
| that work-groups placed in the pool will eventually execute.</p> |
| </dd> |
| <dt class="hdlist1">Work-item </dt> |
| <dd> |
| <p>One of a collection of parallel executions of a <em>kernel</em> invoked on a |
| <em>device</em> by a <em>command</em>. |
| A <em>work-item</em> is executed by one or more <em>processing elements</em> as part |
| of a <em>work-group</em> executing on a <em>compute unit</em>. |
| A <em>work-item</em> is distinguished from other work-items by its <em>global ID</em> |
| or the combination of its <em>work-group</em> ID and its <em>local ID</em> within a |
| <em>work-group</em>.</p> |
| </dd> |
| </dl> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="_the_opencl_architecture"><a class="anchor" href="#_the_opencl_architecture"></a>3. The OpenCL Architecture</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p><strong>OpenCL</strong> is an open industry standard for programming a heterogeneous |
| collection of CPUs, GPUs and other discrete computing devices organized into |
| a single platform. |
| It is more than a language. |
| OpenCL is a framework for parallel programming and includes a language, API, |
| libraries and a runtime system to support software development. |
| Using OpenCL, for example, a programmer can write general purpose programs |
| that execute on GPUs without the need to map their algorithms onto a 3D |
| graphics API such as OpenGL or DirectX.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The target of OpenCL is expert programmers wanting to write portable yet |
| efficient code. |
| This includes library writers, middleware vendors, and performance oriented |
| application programmers. |
| Therefore OpenCL provides a low-level hardware abstraction plus a framework |
| to support programming and many details of the underlying hardware are |
| exposed.</p> |
| </div> |
| <div class="paragraph"> |
| <p>To describe the core ideas behind OpenCL, we will use a hierarchy of models:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Platform Model</p> |
| </li> |
| <li> |
| <p>Memory Model</p> |
| </li> |
| <li> |
| <p>Execution Model</p> |
| </li> |
| <li> |
| <p>Programming Model</p> |
| </li> |
| </ul> |
| </div> |
| <div class="sect2"> |
| <h3 id="_platform_model"><a class="anchor" href="#_platform_model"></a>3.1. Platform Model</h3> |
| <div class="paragraph"> |
| <p>The <a href="#platform-model-image">Platform model</a> for OpenCL is defined below. |
| The model consists of a <strong>host</strong> connected to one or more <strong>OpenCL devices</strong>. |
| An OpenCL device is divided into one or more <strong>compute units</strong> (CUs) which are |
| further divided into one or more <strong>processing elements</strong> (PEs). |
| Computations on a device occur within the processing elements.</p> |
| </div> |
| <div class="paragraph"> |
| <p>An OpenCL application is implemented as both host code and device kernel |
| code. |
| The host code portion of an OpenCL application runs on a host processor |
| according to the models native to the host platform. |
| The OpenCL application host code submits the kernel code as commands from |
| the host to OpenCL devices. |
| An OpenCL device executes the commands computation on the processing |
| elements within the device.</p> |
| </div> |
| <div class="paragraph"> |
| <p>An OpenCL device has considerable latitude on how computations are mapped |
| onto the devices processing elements. |
| When processing elements within a compute unit execute the same sequence of |
| statements across the processing elements, the control flow is said to be |
| <em>converged</em>. |
| Hardware optimized for executing a single stream of instructions over |
| multiple processing elements is well suited to converged control flows. |
| When the control flow varies from one processing element to another, it is |
| said to be <em>diverged</em>. |
| While a kernel always begins execution with a converged control flow, due to |
| branching statements within a kernel, converged and diverged control flows |
| may occur within a single kernel. |
| This provides a great deal of flexibility in the algorithms that can be |
| implemented with OpenCL.</p> |
| </div> |
| <div id="platform-model-image" class="imageblock text-center"> |
| <div class="content"> |
| <img src="data:image/png;base64,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k6NHjzY37LRhmh+M59Xvg3nHDmBHuLp+rtoAz/j7778n11tvveTIkSOr7TAzZsywcuT+5ptvTrZo0SKpnUDy7LPPTirxJffZZ5+kknNSiTS5xx57JD/88MPkpptummzVqlXykUcesbDbb7998rDDDrNw22yzTVI7EDNbb711cty4cVbOhx56aLJXr17JNm3aJJX8kzfccEPyoYceSq699toW7tRTT7V3ox2EvUswatSo5Lrrrpv866+/7DcYPny4xaEdT1I7KAu71lprJS+99FIL37lz5+SwYcMszZ9++im55557Jq+88kp7HvDkk09amjzniy++aGEmTpxo/oiX+Hr37m1+tZOozkuIVYu65Mk1Q9xbArQcTOpBwsHUFZCqkBgZ+iMtckQe+60jiXkelaxMCuNeG7rZc8Xery454AezJoBnpsx4f0ir3LPHDxIsO1GyzPG5556T//znP3Yq1VtvvSXamcptt91m6h7Ki1EAH54h/eOXkcCjjz5qZcgOl+j7+/TpYyOFs846y8qaE60od96JEr60bdvWJspRFfHuOP3qhRdesLiJgzN6kbj9vfDOCR8E0jrmnnvukaefftrUOOSVOBjl8d3EnXfeaWneddddoh2PjTKoO3zEdcUVV9hzosJ67733bHRCXSJNztnt3r27hecoRkYpPDsmRMNFSPQB0HB8KFsXoLGxRzoN98QTT7RGSOMkT5AKCHZE2EEUhOPeGyykx29/Hg/b0EFZYNBZo07hHgJEd/3HH38YsTHReeSRR5oenDJm8zJIFXLnIyfCoCrbZZddbIsD3gFlzqlUkDZ+rrvuOtOtu9rG6wx+GzdubCqW9u3b2wdT+IGML7vsMksfwub9OLkH35eDPIDp06eb/S233CI33XSThYe4DzjgANGRgHUsXLt27WqqGdLX0Yuly9LbSy65xDoJOj5UQnQE3bp1M3Xg0KFD7dnpdDy9EA0XaxzR03BouBCoS1U0VMiBxsI97hhvfNy7tEzDBIR1gvX4/DdXDHb8duPuQePw33xCD8kgkQIaoadN3pigIz0H9r5sEEOakIvH57pg0gbBfDYk8EysRoLIOVoQQMJ8sYqEjXRPOUGEDv+SlXJF8gdB6Zp3gDtliI4ecgesfiItl8zXXXdds0fXzzsgHHFyT9jTTjvNiP6qq66Sgw8+2OIkL1wB74dVNg46Bjob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" alt="platform model"> |
| </div> |
| <div class="title">Figure 1. Platform Model …​ one host plus one or more compute devices each with one or more compute units composed of one or more processing elements.</div> |
| </div> |
| <div class="paragraph"> |
| <p>Programmers may provide programs in the form of OpenCL C source strings, |
| the SPIR-V intermediate language, or as implementation-defined binary objects. |
| An OpenCL platform provides a compiler to translate programs of these |
| forms into executable program objects. |
| The device code compiler may be <em>online</em> or <em>offline</em>. |
| An <em>online</em> <em>compiler</em> is available during host program execution using |
| standard APIs. |
| An <em>offline compiler</em> is invoked outside of host program control, using |
| platform-specific methods. |
| The OpenCL runtime allows developers to get a previously compiled device |
| program executable and be able to load and execute a previously compiled |
| device program executable.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL defines two kinds of platform profiles: a <em>full profile</em> and a |
| reduced-functionality <em>embedded profile</em>. |
| A full profile platform must provide an online compiler for all its devices. |
| An embedded platform may provide an online compiler, but is not required to |
| do so.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A device may expose special purpose functionality as a <em>built-in kernel</em>. |
| The platform provides APIs for enumerating and invoking the built-in |
| kernels offered by a device, but otherwise does not define their |
| construction or semantics. |
| A <em>custom device</em> supports only built-in kernels, and cannot be programmed |
| via a kernel language.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Built-in kernels and custom devices are <a href="#unified-spec">missing before</a> |
| version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>All device types support the OpenCL execution model, the OpenCL memory |
| model, and the APIs used in OpenCL to manage devices.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The platform model is an abstraction describing how OpenCL views the |
| hardware. |
| The relationship between the elements of the platform model and the hardware |
| in a system may be a fixed property of a device or it may be a dynamic |
| feature of a program dependent on how a compiler optimizes code to best |
| utilize physical hardware.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_execution_model"><a class="anchor" href="#_execution_model"></a>3.2. Execution Model</h3> |
| <div class="paragraph"> |
| <p>The OpenCL execution model is defined in terms of two distinct units of |
| execution: <strong>kernels</strong> that execute on one or more OpenCL devices and a <strong>host |
| program</strong> that executes on the host. |
| With regard to OpenCL, the kernels are where the "work" associated with a |
| computation occurs. |
| This work occurs through <strong>work-items</strong> that execute in groups |
| (<strong>work-groups</strong>).</p> |
| </div> |
| <div class="paragraph"> |
| <p>A kernel executes within a well-defined context managed by the host. |
| The context defines the environment within which kernels execute. |
| It includes the following resources:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Devices</strong>: One or more devices exposed by the OpenCL platform.</p> |
| </li> |
| <li> |
| <p><strong>Kernel Objects</strong>: The OpenCL functions with their associated argument |
| values that run on OpenCL devices.</p> |
| </li> |
| <li> |
| <p><strong>Program Objects</strong>: The program source and executable that implement the |
| kernels.</p> |
| </li> |
| <li> |
| <p><strong>Memory Objects</strong>: Variables visible to the host and the OpenCL devices. |
| Instances of kernels operate on these objects as they execute.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The host program uses the OpenCL API to create and manage the context. |
| Functions from the OpenCL API enable the host to interact with a device |
| through a <em>command-queue</em>. |
| Each command-queue is associated with a single device. |
| The commands placed into the command-queue fall into one of three types:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Kernel-enqueue commands</strong>: Enqueue a kernel for execution on a device.</p> |
| </li> |
| <li> |
| <p><strong>Memory commands</strong>: Transfer data between the host and device memory, |
| between memory objects, or map and unmap memory objects from the host |
| address space.</p> |
| </li> |
| <li> |
| <p><strong>Synchronization commands</strong>: Explicit synchronization points that define |
| order constraints between commands.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>In addition to commands submitted from the host command-queue, a kernel |
| running on a device can enqueue commands to a device-side command queue. |
| This results in <em>child kernels</em> enqueued by a kernel executing on a device |
| (the <em>parent kernel</em>). |
| Regardless of whether the command-queue resides on the host or a device, |
| each command passes through six states.</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p><strong>Queued</strong>: The command is enqueued to a command-queue. |
| A command may reside in the queue until it is flushed either explicitly |
| (a call to <a href="#clFlush"><strong>clFlush</strong></a>) or implicitly by some other command.</p> |
| </li> |
| <li> |
| <p><strong>Submitted</strong>: The command is flushed from the command-queue and submitted |
| for execution on the device. |
| Once flushed from the command-queue, a command will execute after any |
| prerequisites for execution are met.</p> |
| </li> |
| <li> |
| <p><strong>Ready</strong>: All prerequisites constraining execution of a command have been |
| met. |
| The command, or for a kernel-enqueue command the collection of work |
| groups associated with a command, is placed in a device work-pool from |
| which it is scheduled for execution.</p> |
| </li> |
| <li> |
| <p><strong>Running</strong>: Execution of the command starts. |
| For the case of a kernel-enqueue command, one or more work-groups |
| associated with the command start to execute.</p> |
| </li> |
| <li> |
| <p><strong>Ended</strong>: Execution of a command ends. |
| When a Kernel-enqueue command ends, all of the work-groups associated |
| with that command have finished their execution. |
| <em>Immediate side effects</em>, i.e. those associated with the kernel but not |
| necessarily with its child kernels, are visible to other units of |
| execution. |
| These side effects include updates to values in global memory.</p> |
| </li> |
| <li> |
| <p><strong>Complete</strong>: The command and its child commands have finished execution |
| and the status of the event object, if any, associated with the command |
| is set to <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>.</p> |
| </li> |
| </ol> |
| </div> |
| <div class="paragraph"> |
| <p>The <a href="#profiled-states-image">execution states and the transitions between |
| them</a> are summarized below. |
| These states and the concept of a device work-pool are conceptual elements |
| of the execution model. |
| An implementation of OpenCL has considerable freedom in how these are |
| exposed to a program. |
| Five of the transitions, however, are directly observable through a |
| profiling interface. |
| These <a href="#profiled-states-image">profiled states</a> are shown below.</p> |
| </div> |
| <div id="profiled-states-image" class="imageblock text-center"> |
| <div class="content"> |
| <img src="data:image/png;base64,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" alt="profiled states"> |
| </div> |
| <div class="title">Figure 2. The states and transitions between states defined in the OpenCL execution model. A subset of these transitions is exposed through the <a href="#profiling-operations">profiling interface</a>.</div> |
| </div> |
| <div class="paragraph"> |
| <p>Commands communicate their status through <em>Event objects</em>. |
| Successful completion is indicated by setting the event status associated |
| with a command to <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>. |
| Unsuccessful completion results in abnormal termination of the command which |
| is indicated by setting the event status to a negative value. |
| In this case, the command-queue associated with the abnormally terminated |
| command and all other command-queues in the same context may no longer be |
| available and their behavior is implementation defined.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A command submitted to a device will not launch until prerequisites that |
| constrain the order of commands have been resolved. |
| These prerequisites have three sources:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>They may arise from commands submitted to a command-queue that constrain |
| the order in which commands are launched. |
| For example, commands that follow a command queue barrier will not |
| launch until all commands prior to the barrier are complete.</p> |
| </li> |
| <li> |
| <p>The second source of prerequisites is dependencies between commands |
| expressed through events. |
| A command may include an optional list of events. |
| The command will wait and not launch until all the events in the list |
| are in the state CL COMPLETE. |
| By this mechanism, event objects define order constraints between |
| commands and coordinate execution between the host and one or more |
| devices.</p> |
| </li> |
| <li> |
| <p>The third source of prerequisites can be the presence of non-trivial C |
| initializers or C++ constructors for program scope global variables. |
| In this case, OpenCL C/C++ compiler shall generate program |
| initialization kernels that perform C initialization or C++ |
| construction. |
| These kernels must be executed by OpenCL runtime on a device before any |
| kernel from the same program can be executed on the same device. |
| The ND-range for any program initialization kernel is (1,1,1). |
| When multiple programs are linked together, the order of execution of |
| program initialization kernels that belong to different programs is |
| undefined.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Program clean up may result in the execution of one or more program clean up |
| kernels by the OpenCL runtime. |
| This is due to the presence of non-trivial C++ destructors for |
| program scope variables. |
| The ND-range for executing any program clean up kernel is (1,1,1). |
| The order of execution of clean up kernels from different programs (that are |
| linked together) is undefined.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Program initialization and clean-up kernels are <a href="#unified-spec">missing before</a> version 2.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Note that C initializers, C++ constructors, or C++ destructors for program |
| scope variables cannot use pointers to coarse grain and fine grain SVM |
| allocations.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A command may be submitted to a device and yet have no visible side effects |
| outside of waiting on and satisfying event dependences. |
| Examples include markers, kernels executed over ranges of no work-items or |
| copy operations with zero sizes. |
| Such commands may pass directly from the <em>ready</em> state to the <em>ended</em> state.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Command execution can be blocking or non-blocking. |
| Consider a sequence of OpenCL commands. |
| For blocking commands, the OpenCL API functions that enqueue commands don’t |
| return until the command has completed. |
| Alternatively, OpenCL functions that enqueue non-blocking commands return |
| immediately and require that a programmer defines dependencies between |
| enqueued commands to ensure that enqueued commands are not launched before |
| needed resources are available. |
| In both cases, the actual execution of the command may occur asynchronously |
| with execution of the host program.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Commands within a single command-queue execute relative to each other in one |
| of two modes:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>In-order Execution</strong>: Commands and any side effects associated with |
| commands appear to the OpenCL application as if they execute in the same |
| order they are enqueued to a command-queue.</p> |
| </li> |
| <li> |
| <p><strong>Out-of-order Execution</strong>: Commands execute in any order constrained only |
| by explicit synchronization points (e.g. through command queue barriers) |
| or explicit dependencies on events.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Multiple command-queues can be present within a single context. |
| Multiple command-queues execute commands independently. |
| Event objects visible to the host program can be used to define |
| synchronization points between commands in multiple command queues. |
| If such synchronization points are established between commands in multiple |
| command-queues, an implementation must assure that the command-queues |
| progress concurrently and correctly account for the dependencies established |
| by the synchronization points. |
| For a detailed explanation of synchronization points, see the execution model |
| <a href="#execution-model-sync">Synchronization</a> section.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The core of the OpenCL execution model is defined by how the kernels |
| execute. |
| When a kernel-enqueue command submits a kernel for execution, an index space |
| is defined. |
| The kernel, the argument values associated with the arguments to the kernel, |
| and the parameters that define the index space define a <em>kernel-instance</em>. |
| When a kernel-instance executes on a device, the kernel function executes |
| for each point in the defined index space. |
| Each of these executing kernel functions is called a <em>work-item</em>. |
| The work-items associated with a given kernel-instance are managed by the |
| device in groups called <em>work-groups</em>. |
| These work-groups define a coarse grained decomposition of the Index space. |
| Work-groups are further divided into <em>sub-groups</em>, which provide an |
| additional level of control over execution.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Sub-groups are <a href="#unified-spec">missing before</a> version 2.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Work-items have a global ID based on their coordinates within the Index |
| space. |
| They can also be defined in terms of their work-group and the local ID |
| within a work-group. |
| The details of this mapping are described in the following section.</p> |
| </div> |
| <div class="sect3"> |
| <h4 id="_mapping_work_items_onto_an_ndrange"><a class="anchor" href="#_mapping_work_items_onto_an_ndrange"></a>3.2.1. Mapping work-items onto an NDRange</h4> |
| <div class="paragraph"> |
| <p>The index space supported by OpenCL is called an NDRange. |
| An NDRange is an N-dimensional index space, where N is one, two or three. |
| The NDRange is decomposed into work-groups forming blocks that cover the |
| Index space. |
| An NDRange is defined by three integer arrays of length N:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The extent of the index space (or global size) in each dimension.</p> |
| </li> |
| <li> |
| <p>An offset index F indicating the initial value of the indices in each |
| dimension (zero by default).</p> |
| </li> |
| <li> |
| <p>The size of a work-group (local size) in each dimension.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Each work-items global ID is an N-dimensional tuple. |
| The global ID components are values in the range from F, to F plus the |
| number of elements in that dimension minus one.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Unless a kernel comes from a source that disallows it, e.g. OpenCL C 1.x or |
| using <code>-cl-uniform-work-group-size</code>, the size of work-groups in |
| an NDRange (the local size) need not be the same for all work-groups. |
| In this case, any single dimension for which the global size is not |
| divisible by the local size will be partitioned into two regions. |
| One region will have work-groups that have the same number of work-items as |
| was specified for that dimension by the programmer (the local size). |
| The other region will have work-groups with less than the number of work |
| items specified by the local size parameter in that dimension (the |
| <em>remainder work-groups</em>). |
| Work-group sizes could be non-uniform in multiple dimensions, potentially |
| producing work-groups of up to 4 different sizes in a 2D range and 8 |
| different sizes in a 3D range.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Non-uniform work-group sizes are <a href="#unified-spec">missing before</a> version |
| 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Each work-item is assigned to a work-group and given a local ID to represent |
| its position within the work-group. |
| A work-item’s local ID is an N-dimensional tuple with components in the |
| range from zero to the size of the work-group in that dimension minus one.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Work-groups are assigned IDs similarly. |
| The number of work-groups in each dimension is not directly defined but is |
| inferred from the local and global NDRanges provided when a kernel-instance |
| is enqueued. |
| A work-group’s ID is an N-dimensional tuple with components in the range 0 |
| to the ceiling of the global size in that dimension divided by the local |
| size in the same dimension. |
| As a result, the combination of a work-group ID and the local-ID within a |
| work-group uniquely defines a work-item. |
| Each work-item is identifiable in two ways; in terms of a global index, and |
| in terms of a work-group index plus a local index within a work-group.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For example, consider the <a href="#index-space-image">2-dimensional index space</a> |
| shown below. |
| We input the index space for the work-items (G<sub>x</sub>, G<sub>y</sub>), the size of each |
| work-group (S<sub>x</sub>, S<sub>y</sub>) and the global ID offset (F<sub>x</sub>, F<sub>y</sub>). |
| The global indices define an G<sub>x</sub>by G<sub>y</sub> index space where the total number |
| of work-items is the product of G<sub>x</sub> and G<sub>y</sub>. |
| The local indices define an S<sub>x</sub> by S<sub>y</sub> index space where the number of |
| work-items in a single work-group is the product of S<sub>x</sub> and S<sub>y</sub>. |
| Given the size of each work-group and the total number of work-items we can |
| compute the number of work-groups. |
| A 2-dimensional index space is used to uniquely identify a work-group. |
| Each work-item is identified by its global ID (<em>g</em><sub>x</sub>, <em>g</em><sub>y</sub>) or by the |
| combination of the work-group ID (<em>w</em><sub>x</sub>, <em>w</em><sub>y</sub>), the size of each |
| work-group (S<sub>x</sub>,S<sub>y</sub>) and the local ID (s<sub>x</sub>, s<sub>y</sub>) inside the work-group |
| such that</p> |
| </div> |
| <div class="ulist none"> |
| <ul class="none"> |
| <li> |
| <p>(g<sub>x</sub>, g<sub>y</sub>) = (w<sub>x</sub> × S<sub>x</sub> + s<sub>x</sub> + F<sub>x</sub>, w<sub>y</sub> × S<sub>y</sub> + s<sub>y</sub> + F<sub>y</sub>)</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The number of work-groups can be computed as:</p> |
| </div> |
| <div class="ulist none"> |
| <ul class="none"> |
| <li> |
| <p>(W<sub>x</sub>, W<sub>y</sub>) = (ceil(G<sub>x</sub> / S<sub>x</sub>), ceil(G<sub>y</sub> / S<sub>y</sub>))</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Given a global ID and the work-group size, the work-group ID for a work-item |
| is computed as:</p> |
| </div> |
| <div class="ulist none"> |
| <ul class="none"> |
| <li> |
| <p>(w<sub>x</sub>, w<sub>y</sub>) = ( (g<sub>x</sub> - s<sub>x</sub> - F<sub>x</sub>) / S<sub>x</sub>, (g<sub>y</sub> - s<sub>y</sub> - F<sub>y</sub>) / S<sub>y</sub> )</p> |
| </li> |
| </ul> |
| </div> |
| <div id="index-space-image" class="imageblock text-center"> |
| <div class="content"> |
| <img src="data:image/jpg;base64,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/wDwlWiHSbfVFv42sriN5IpVBIZVBLHpngA0AV/7N8T/APQw2v8A4Lx/8XR/Zvif/oYbX/wXj/4ukTx14ck0ufUU1EG3gkWOX904dGbhQUxu5zxxzWlo+t6dr1o11ptyJ4lcxt8pUqw7EEAg8jrQBnf2b4n/AOhhtf8AwXj/AOLo/s3xP/0MNr/4Lx/8XXQ0UAc9/Zvif/oYbX/wXj/4uj+zfE//AEMNr/4Lx/8AF10NRW9zFdRs8TEqrshypHKnB6+4oAw/7N8T/wDQw2v/AILx/wDF0f2b4n/6GG1/8F4/+LroaxNN8W6Jq+pPp9leiW4UMQNjKsgU4YoxGGweDgmgCH+zfE//AEMNr/4Lx/8AF1V1HR/FNxp1xCuvW7s6FQq2nlk/Rg+V+tdXRQB5poeleJdJ8X+H4fEeuRao5hvPJ2xYaMYTgvwX/IV6XUbQQvPHM8SNLGCEcqCyg9cHtnAqSgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAIrkFrSYKCWKMAB9K8ifw/rml21jBBp08umS6c1yY44yZLe58kK8e3/aPIHrmvYqKAPLr/T9S8Sa62tW1hqOn25extkeSHZO2ybe8pRgcBQcAsPWs7XdI1WCPUrEWmoXzvqMsovXs2laXdAnl4ClVyDuUP0Xb0ya9iooA8gk0S+XSrrV0tL+G+nuLjzJJWaN/IMQ4+Y4UEg496zL2xkv5b0aLp+o22mpcui2pt2leOZoI9h2bwY++CeFJyQM17dPBFdW8kE8aSwyKVdHGQwPUEVBp2l2OkWxt9PtIraEsXKxLgFj1J9TQBxXjqyv5U0Nktrq5mhUgqkLSo0nycMVIMbcHEnQc561i3VlfXPiNIW0fU4rqD7VLbXyQOVeZ3kESmQcKig7ueMlfSvWqKAPN/h1pOpQaZqcN0t1C0tvHE3n27Q/vwrB2GWJY5Iy44btTdIv9UtLnRom0nVo4dKs5Ir6E2ieUGSPAMTkZYsRng4I6816VUF7BJdWM8ENw1vJIhVZlGSme496GBT0PXbLxFYG+08yPalyiSsu0SY6lfUZ4+oNadZPh3QIPDWljTbSaWS0RyYUlOTGp5257jOT+Na1ABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAH//2Q==" alt="index space"> |
| </div> |
| <div class="title">Figure 3. An example of an NDRange index space showing work-items, their global IDs and their mapping onto the pair of work-group and local IDs. In this case, we assume that in each dimension, the size of the work-group evenly divides the global NDRange size (i.e. all work-groups have the same size) and that the offset is equal to zero.</div> |
| </div> |
| <div class="paragraph"> |
| <p>Within a work-group work-items may be divided into sub-groups. |
| The mapping of work-items to sub-groups is implementation-defined and may be |
| queried at runtime. |
| While sub-groups may be used in multi-dimensional work-groups, each |
| sub-group is 1-dimensional and any given work-item may query which sub-group |
| it is a member of.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Sub-groups are <a href="#unified-spec">missing before</a> version 2.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Work-items are mapped into sub-groups through a combination of compile-time |
| decisions and the parameters of the dispatch. |
| The mapping to sub-groups is invariant for the duration of a kernels |
| execution, across dispatches of a given kernel with the same work-group |
| dimensions, between dispatches and query operations consistent with the |
| dispatch parameterization, and from one work-group to another within the |
| dispatch (excluding the trailing edge work-groups in the presence of |
| non-uniform work-group sizes). |
| In addition, all sub-groups within a work-group will be the same size, apart |
| from the sub-group with the maximum index which may be smaller if the size |
| of the work-group is not evenly divisible by the size of the sub-groups.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In the degenerate case, a single sub-group must be supported for each |
| work-group. |
| In this situation all sub-group scope functions are equivalent to their |
| work-group level equivalents.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_execution_of_kernel_instances"><a class="anchor" href="#_execution_of_kernel_instances"></a>3.2.2. Execution of kernel-instances</h4> |
| <div class="paragraph"> |
| <p>The work carried out by an OpenCL program occurs through the execution of |
| kernel-instances on compute devices. |
| To understand the details of OpenCL’s execution model, we need to consider |
| how a kernel object moves from the kernel-enqueue command, into a |
| command-queue, executes on a device, and completes.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A kernel object is defined as a function within the program object and a |
| collection of arguments connecting the kernel to a set of argument values. |
| The host program enqueues a kernel object to the command queue along with |
| the NDRange and the work-group decomposition. |
| These define a <em>kernel-instance</em>. |
| In addition, an optional set of events may be defined when the kernel is |
| enqueued. |
| The events associated with a particular kernel-instance are used to |
| constrain when the kernel-instance is launched with respect to other |
| commands in the queue or to commands in other queues within the same |
| context.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A kernel-instance is submitted to a device. |
| For an in-order command queue, the kernel instances appear to launch and |
| then execute in that same order; where we use the term appear to emphasize |
| that when there are no dependencies between commands and hence differences |
| in the order that commands execute cannot be observed in a program, an |
| implementation can reorder commands even in an in-order command queue. |
| For an out of order command-queue, kernel-instances wait to be launched |
| until:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Synchronization commands enqueued prior to the kernel-instance are |
| satisfied.</p> |
| </li> |
| <li> |
| <p>Each of the events in an optional event list defined when the |
| kernel-instance was enqueued are set to <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Once these conditions are met, the kernel-instance is launched and the |
| work-groups associated with the kernel-instance are placed into a pool of |
| ready to execute work-groups. |
| This pool is called a <em>work-pool</em>. |
| The work-pool may be implemented in any manner as long as it assures that |
| work-groups placed in the pool will eventually execute. |
| The device schedules work-groups from the work-pool for execution on the |
| compute units of the device. |
| The kernel-enqueue command is complete when all work-groups associated with |
| the kernel-instance end their execution, updates to global memory associated |
| with a command are visible globally, and the device signals successful |
| completion by setting the event associated with the kernel-enqueue command |
| to <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>While a command-queue is associated with only one device, a single device |
| may be associated with multiple command-queues all feeding into the single |
| work-pool. |
| A device may also be associated with command queues associated with |
| different contexts within the same platform, again all feeding into the |
| single work-pool. |
| The device will pull work-groups from the work-pool and execute them on one |
| or several compute units in any order; possibly interleaving execution of |
| work-groups from multiple commands. |
| A conforming implementation may choose to serialize the work-groups so a |
| correct algorithm cannot assume that work-groups will execute in parallel. |
| There is no safe and portable way to synchronize across the independent |
| execution of work-groups since once in the work-pool, they can execute in |
| any order.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The work-items within a single sub-group execute concurrently but not |
| necessarily in parallel (i.e. they are not guaranteed to make independent |
| forward progress). |
| Therefore, only high-level synchronization constructs (e.g. sub-group |
| functions such as barriers) that apply to all the work-items in a sub-group |
| are well defined and included in OpenCL.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Sub-groups are <a href="#unified-spec">missing before</a> version 2.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Sub-groups execute concurrently within a given work-group and with |
| appropriate device support (see <a href="#platform-querying-devices">Querying |
| Devices</a>), may make independent forward progress with respect to each |
| other, with respect to host threads and with respect to any entities |
| external to the OpenCL system but running on an OpenCL device, even in the |
| absence of work-group barrier operations. |
| In this situation, sub-groups are able to internally synchronize using |
| barrier operations without synchronizing with each other and may perform |
| operations that rely on runtime dependencies on operations other sub-groups |
| perform.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The work-items within a single work-group execute concurrently but are only |
| guaranteed to make independent progress in the presence of sub-groups and |
| device support. |
| In the absence of this capability, only high-level synchronization |
| constructs (e.g. work-group functions such as barriers) that apply to all |
| the work-items in a work-group are well defined and included in OpenCL for |
| synchronization within the work-group.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In the absence of synchronization functions (e.g. a barrier), work-items |
| within a sub-group may be serialized. |
| In the presence of sub -group functions, work-items within a sub -group may |
| be serialized before any given sub -group function, between dynamically |
| encountered pairs of sub-group functions and between a work-group function |
| and the end of the kernel.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In the absence of independent forward progress of constituent sub-groups, |
| work-items within a work-group may be serialized before, after or between |
| work-group synchronization functions.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="device-side-enqueue"><a class="anchor" href="#device-side-enqueue"></a>3.2.3. Device-side enqueue</h4> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Device-side enqueue is <a href="#unified-spec">missing before</a> version 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Algorithms may need to generate additional work as they execute. |
| In many cases, this additional work cannot be determined statically; so the |
| work associated with a kernel only emerges at runtime as the kernel-instance |
| executes. |
| This capability could be implemented in logic running within the host |
| program, but involvement of the host may add significant overhead and/or |
| complexity to the application control flow. |
| A more efficient approach would be to nest kernel-enqueue commands from |
| inside other kernels. |
| This <strong>nested parallelism</strong> can be realized by supporting the enqueuing of |
| kernels on a device without direct involvement by the host program; |
| so-called <strong>device-side enqueue</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Device-side kernel-enqueue commands are similar to host-side kernel-enqueue |
| commands. |
| The kernel executing on a device (the <strong>parent kernel</strong>) enqueues a |
| kernel-instance (the <strong>child kernel</strong>) to a device-side command queue. |
| This is an out-of-order command-queue and follows the same behavior as the |
| out-of-order command-queues exposed to the host program. |
| Commands enqueued to a device side command-queue generate and use events to |
| enforce order constraints just as for the command-queue on the host. |
| These events, however, are only visible to the parent kernel running on the |
| device. |
| When these prerequisite events take on the value <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>, the |
| work-groups associated with the child kernel are launched into the devices |
| work pool. |
| The device then schedules them for execution on the compute units of the |
| device. |
| Child and parent kernels execute asynchronously. |
| However, a parent will not indicate that it is complete by setting its event |
| to <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a> until all child kernels have ended execution and have |
| signaled completion by setting any associated events to the value |
| <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>. |
| Should any child kernel complete with an event status set to a negative |
| value (i.e. abnormally terminate), the parent kernel will abnormally |
| terminate and propagate the childs negative event value as the value of the |
| parents event. |
| If there are multiple children that have an event status set to a negative |
| value, the selection of which childs negative event value is propagated is |
| implementation-defined.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="execution-model-sync"><a class="anchor" href="#execution-model-sync"></a>3.2.4. Synchronization</h4> |
| <div class="paragraph"> |
| <p>Synchronization refers to mechanisms that constrain the order of execution |
| between two or more units of execution. |
| Consider the following three domains of synchronization in OpenCL:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Work-group synchronization: Constraints on the order of execution for |
| work-items in a single work-group</p> |
| </li> |
| <li> |
| <p>Sub-group synchronization: Constraints on the order of execution for |
| work-items in a single sub-group. |
| Note: Sub-groups are <a href="#unified-spec">missing before</a> version 2.1</p> |
| </li> |
| <li> |
| <p>Command synchronization: Constraints on the order of commands launched |
| for execution</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Synchronization across all work-items within a single work-group is carried |
| out using a <em>work-group function</em>. |
| These functions carry out collective operations across all the work-items in |
| a work-group. |
| Available collective operations are: barrier, reduction, broadcast, prefix |
| sum, and evaluation of a predicate. |
| A work-group function must occur within a converged control flow; i.e. all |
| work-items in the work-group must encounter precisely the same work-group |
| function. |
| For example, if a work-group function occurs within a loop, the work-items |
| must encounter the same work-group function in the same loop iterations. |
| All the work-items of a work-group must execute the work-group function and |
| complete reads and writes to memory before any are allowed to continue |
| execution beyond the work-group function. |
| Work-group functions that apply between work-groups are not provided in |
| OpenCL since OpenCL does not define forward-progress or ordering relations |
| between work-groups, hence collective synchronization operations are not |
| well defined.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Synchronization across all work-items within a single sub-group is carried |
| out using a <em>sub-group function</em>. |
| These functions carry out collective operations across all the work-items in |
| a sub-group. |
| Available collective operations are: barrier, reduction, broadcast, prefix |
| sum, and evaluation of a predicate. |
| A sub-group function must occur within a converged control flow; i.e. all |
| work-items in the sub-group must encounter precisely the same sub-group |
| function. |
| For example, if a work-group function occurs within a loop, the work-items |
| must encounter the same sub-group function in the same loop iterations. |
| All the work-items of a sub-group must execute the sub-group function and |
| complete reads and writes to memory before any are allowed to continue |
| execution beyond the sub-group function. |
| Synchronization between sub-groups must either be performed using work-group |
| functions, or through memory operations. |
| Using memory operations for sub-group synchronization should be used |
| carefully as forward progress of sub-groups relative to each other is only |
| supported optionally by OpenCL implementations.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Command synchronization is defined in terms of distinct <strong>synchronization |
| points</strong>. |
| The synchronization points occur between commands in host command-queues and |
| between commands in device-side command-queues. |
| The synchronization points defined in OpenCL include:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Launching a command:</strong> A kernel-instance is launched onto a device after |
| all events that kernel is waiting-on have been set to <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>.</p> |
| </li> |
| <li> |
| <p><strong>Ending a command:</strong> Child kernels may be enqueued such that they wait |
| for the parent kernel to reach the <em>end</em> state before they can be |
| launched. |
| In this case, the ending of the parent command defines a synchronization |
| point.</p> |
| </li> |
| <li> |
| <p><strong>Completion of a command:</strong> A kernel-instance is complete after all of |
| the work-groups in the kernel and all of its child kernels have |
| completed. |
| This is signaled to the host, a parent kernel or other kernels within |
| command queues by setting the value of the event associated with a |
| kernel to <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a>.</p> |
| </li> |
| <li> |
| <p><strong>Blocking Commands:</strong> A blocking command defines a synchronization point |
| between the unit of execution that calls the blocking API function and |
| the enqueued command reaching the complete state.</p> |
| </li> |
| <li> |
| <p><strong>Command-queue barrier:</strong> The command-queue barrier ensures that all |
| previously enqueued commands have completed before subsequently enqueued |
| commands can be launched.</p> |
| </li> |
| <li> |
| <p><a href="#clFinish"><strong>clFinish</strong></a>: This function blocks until all previously enqueued commands |
| in the command queue have completed after which <a href="#clFinish"><strong>clFinish</strong></a> defines a |
| synchronization point and the <a href="#clFinish"><strong>clFinish</strong></a> function returns.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>A synchronization point between a pair of commands (A and B) assures that |
| results of command A happens-before command B is launched. |
| This requires that any updates to memory from command A complete and are |
| made available to other commands before the synchronization point completes. |
| Likewise, this requires that command B waits until after the synchronization |
| point before loading values from global memory. |
| The concept of a synchronization point works in a similar fashion for |
| commands such as a barrier that apply to two sets of commands. |
| All the commands prior to the barrier must complete and make their results |
| available to following commands. |
| Furthermore, any commands following the barrier must wait for the commands |
| prior to the barrier before loading values and continuing their execution.</p> |
| </div> |
| <div class="paragraph"> |
| <p>These <em>happens-before</em> relationships are a fundamental part of the OpenCL 2.x |
| memory model. |
| When applied at the level of commands, they are straightforward to define at |
| a language level in terms of ordering relationships between different |
| commands. |
| Ordering memory operations inside different commands, however, requires |
| rules more complex than can be captured by the high level concept of a |
| synchronization point. |
| These rules are described in detail in <a href="#memory-ordering-rules">Memory |
| Ordering Rules</a>.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_categories_of_kernels"><a class="anchor" href="#_categories_of_kernels"></a>3.2.5. Categories of Kernels</h4> |
| <div class="paragraph"> |
| <p>The OpenCL execution model supports three types of kernels:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpenCL kernels</strong> are managed by the OpenCL API as kernel objects |
| associated with kernel functions within program objects. |
| OpenCL program objects are created and built using OpenCL APIs. |
| The OpenCL API includes functions to query the kernel languages and |
| and intermediate languages that may be used to create OpenCL program |
| objects for a device.</p> |
| </li> |
| <li> |
| <p><strong>Native kernels</strong> are accessed through a host function pointer. |
| Native kernels are queued for execution along with OpenCL kernels on a |
| device and share memory objects with OpenCL kernels. |
| For example, these native kernels could be functions defined in |
| application code or exported from a library. |
| The ability to execute native kernels is optional within OpenCL and the |
| semantics of native kernels are implementation-defined. |
| The OpenCL API includes functions to query capabilities of a device |
| to determine if this capability is supported.</p> |
| </li> |
| <li> |
| <p><strong>Built-in kernels</strong> are tied to particular device and are not built at |
| runtime from source code in a program object. |
| The common use of built in kernels is to expose fixed-function hardware |
| or firmware associated with a particular OpenCL device or custom device. |
| The semantics of a built-in kernel may be defined outside of OpenCL and |
| hence are implementation defined. |
| Note: Built-in kernels are <a href="#unified-spec">missing before</a> version 1.2.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>All three types of kernels are manipulated through the OpenCL command queues |
| and must conform to the synchronization points defined in the OpenCL |
| execution model.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_memory_model"><a class="anchor" href="#_memory_model"></a>3.3. Memory Model</h3> |
| <div class="paragraph"> |
| <p>The OpenCL memory model describes the structure, contents, and behavior of |
| the memory exposed by an OpenCL platform as an OpenCL program runs. |
| The model allows a programmer to reason about values in memory as the host |
| program and multiple kernel-instances execute.</p> |
| </div> |
| <div class="paragraph"> |
| <p>An OpenCL program defines a context that includes a host, one or more |
| devices, command-queues, and memory exposed within the context. |
| Consider the units of execution involved with such a program. |
| The host program runs as one or more host threads managed by the operating |
| system running on the host (the details of which are defined outside of |
| OpenCL). |
| There may be multiple devices in a single context which all have access to |
| memory objects defined by OpenCL. |
| On a single device, multiple work-groups may execute in parallel with |
| potentially overlapping updates to memory. |
| Finally, within a single work-group, multiple work-items concurrently |
| execute, once again with potentially overlapping updates to memory.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The memory model must precisely define how the values in memory as seen from |
| each of these units of execution interact so a programmer can reason about |
| the correctness of OpenCL programs. |
| We define the memory model in four parts.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Memory regions: The distinct memories visible to the host and the |
| devices that share a context.</p> |
| </li> |
| <li> |
| <p>Memory objects: The objects defined by the OpenCL API and their |
| management by the host and devices.</p> |
| </li> |
| <li> |
| <p>Shared Virtual Memory: A virtual address space exposed to both the host |
| and the devices within a context. |
| Note: SVM is <a href="#unified-spec">missing before</a> version 2.0.</p> |
| </li> |
| <li> |
| <p>Consistency Model: Rules that define which values are observed when |
| multiple units of execution load data from memory plus the atomic/fence |
| operations that constrain the order of memory operations and define |
| synchronization relationships.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="sect3"> |
| <h4 id="_fundamental_memory_regions"><a class="anchor" href="#_fundamental_memory_regions"></a>3.3.1. Fundamental Memory Regions</h4> |
| <div class="paragraph"> |
| <p>Memory in OpenCL is divided into two parts.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Host Memory:</strong> The memory directly available to the host. |
| The detailed behavior of host memory is defined outside of OpenCL. |
| Memory objects move between the Host and the devices through functions |
| within the OpenCL API or through a shared virtual memory interface.</p> |
| </li> |
| <li> |
| <p><strong>Device Memory:</strong> Memory directly available to kernels executing on |
| OpenCL devices.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Device memory consists of four named address spaces or <em>memory regions</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Global Memory:</strong> This memory region permits read/write access to all |
| work-items in all work-groups running on any device within a context. |
| Work-items can read from or write to any element of a memory object. |
| Reads and writes to global memory may be cached depending on the |
| capabilities of the device.</p> |
| </li> |
| <li> |
| <p><strong>Constant Memory</strong>: A region of global memory that remains constant |
| during the execution of a kernel-instance. |
| The host allocates and initializes memory objects placed into constant |
| memory.</p> |
| </li> |
| <li> |
| <p><strong>Local Memory</strong>: A memory region local to a work-group. |
| This memory region can be used to allocate variables that are shared by |
| all work-items in that work-group.</p> |
| </li> |
| <li> |
| <p><strong>Private Memory</strong>: A region of memory private to a work-item. |
| Variables defined in one work-items private memory are not visible to |
| another work-item.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The <a href="#memory-regions-image">memory regions</a> and their relationship to the |
| OpenCL Platform model are summarized below. |
| Local and private memories are always associated with a particular device. |
| The global and constant memories, however, are shared between all devices |
| within a given context. |
| An OpenCL device may include a cache to support efficient access to these |
| shared memories.</p> |
| </div> |
| <div class="paragraph"> |
| <p>To understand memory in OpenCL, it is important to appreciate the |
| relationships between these named address spaces. |
| The four named address spaces available to a device are disjoint meaning |
| they do not overlap. |
| This is a logical relationship, however, and an implementation may choose to |
| let these disjoint named address spaces share physical memory.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Programmers often need functions callable from kernels where the pointers |
| manipulated by those functions can point to multiple named address spaces. |
| This saves a programmer from the error-prone and wasteful practice of |
| creating multiple copies of functions; one for each named address space. |
| Therefore the global, local and private address spaces belong to a single |
| <em>generic address space</em>. |
| This is closely modeled after the concept of a generic address space used in |
| the embedded C standard (ISO/IEC 9899:1999). |
| Since they all belong to a single generic address space, the following |
| properties are supported for pointers to named address spaces in device |
| memory:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>A pointer to the generic address space can be cast to a pointer to a |
| global, local or private address space</p> |
| </li> |
| <li> |
| <p>A pointer to a global, local or private address space can be cast to a |
| pointer to the generic address space.</p> |
| </li> |
| <li> |
| <p>A pointer to a global, local or private address space can be implicitly |
| converted to a pointer to the generic address space, but the converse is |
| not allowed.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The constant address space is disjoint from the generic address space.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| The generic address space is <a href="#unified-spec">missing before</a> version |
| 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>The addresses of memory associated with memory objects in Global memory are |
| not preserved between kernel instances, between a device and the host, and |
| between devices. |
| In this regard global memory acts as a global pool of memory objects rather |
| than an address space. |
| This restriction is relaxed when shared virtual memory (SVM) is used.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Shared virtual memory is <a href="#unified-spec">missing before</a> version 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>SVM causes addresses to be meaningful between the host and all of the |
| devices within a context hence supporting the use of pointer based data |
| structures in OpenCL kernels. |
| It logically extends a portion of the global memory into the host address |
| space giving work-items access to the host address space. |
| On platforms with hardware support for a shared address space between the |
| host and one or more devices, SVM may also provide a more efficient way to |
| share data between devices and the host. |
| Details about SVM are presented in <a href="#shared-virtual-memory">Shared Virtual |
| Memory</a>.</p> |
| </div> |
| <div id="memory-regions-image" class="imageblock text-center"> |
| <div class="content"> |
| <img src="data:image/png;base64,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" alt="memory regions"> |
| </div> |
| <div class="title">Figure 4. The named address spaces exposed in an OpenCL Platform. Global and Constant memories are shared between the one or more devices within a context, while local and private memories are associated with a single device. Each device may include an optional cache to support efficient access to their view of the global and constant address spaces.</div> |
| </div> |
| <div class="paragraph"> |
| <p>A programmer may use the features of the <a href="#memory-consistency-model">memory |
| consistency model</a> to manage safe access to global memory from multiple |
| work-items potentially running on one or more devices. |
| In addition, when using shared virtual memory (SVM), the memory consistency |
| model may also be used to ensure that host threads safely access memory |
| locations in the shared memory region.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_memory_objects"><a class="anchor" href="#_memory_objects"></a>3.3.2. Memory Objects</h4> |
| <div class="paragraph"> |
| <p>The contents of global memory are <em>memory objects</em>. |
| A memory object is a handle to a reference counted region of global memory. |
| Memory objects use the OpenCL type <em>cl_mem</em> and fall into three distinct |
| classes.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Buffer</strong>: A memory object stored as a block of contiguous memory and |
| used as a general purpose object to hold data used in an OpenCL program. |
| The types of the values within a buffer may be any of the built in types |
| (such as int, float), vector types, or user-defined structures. |
| The buffer can be manipulated through pointers much as one would with |
| any block of memory in C.</p> |
| </li> |
| <li> |
| <p><strong>Image</strong>: An image memory object holds one, two or three dimensional |
| images. |
| The formats are based on the standard image formats used in graphics |
| applications. |
| An image is an opaque data structure managed by functions defined in the |
| OpenCL API. |
| To optimize the manipulation of images stored in the texture memories |
| found in many GPUs, OpenCL kernels have traditionally been disallowed |
| from both reading and writing a single image. |
| In OpenCL 2.0, however, we have relaxed this restriction by providing |
| synchronization and fence operations that let programmers properly |
| synchronize their code to safely allow a kernel to read and write a |
| single image.</p> |
| </li> |
| <li> |
| <p><strong>Pipe</strong>: The <em>pipe</em> memory object conceptually is an ordered sequence of |
| data items. |
| A pipe has two endpoints: a write endpoint into which data items are |
| inserted, and a read endpoint from which data items are removed. |
| At any one time, only one kernel instance may write into a pipe, and |
| only one kernel instance may read from a pipe. |
| To support the producer consumer design pattern, one kernel instance |
| connects to the write endpoint (the producer) while another kernel |
| instance connects to the reading endpoint (the consumer). |
| Note: The <em>pipe</em> memory object is <a href="#unified-spec">missing before</a> |
| version 2.0.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Memory objects are allocated by host APIs. |
| The host program can provide the runtime with a pointer to a block of |
| continuous memory to hold the memory object when the object is created |
| (<a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>). |
| Alternatively, the physical memory can be managed by the OpenCL runtime and |
| not be directly accessible to the host program.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Allocation and access to memory objects within the different memory regions |
| varies between the host and work-items running on a device. |
| This is summarized in the <a href="#memory-regions-table">Memory Regions</a> table, |
| which describes whether the kernel or the host can allocate from a memory |
| region, the type of allocation (static at compile time vs. |
| dynamic at runtime) and the type of access allowed (i.e. whether the kernel |
| or the host can read and/or write to a memory region).</p> |
| </div> |
| <table id="memory-regions-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 1. Memory Regions</caption> |
| <colgroup> |
| <col style="width: 12.5%;"> |
| <col style="width: 12.5%;"> |
| <col style="width: 18.75%;"> |
| <col style="width: 18.75%;"> |
| <col style="width: 18.75%;"> |
| <col style="width: 18.75%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"></th> |
| <th class="tableblock halign-left valign-top"></th> |
| <th class="tableblock halign-left valign-top">Global</th> |
| <th class="tableblock halign-left valign-top">Constant</th> |
| <th class="tableblock halign-left valign-top">Local</th> |
| <th class="tableblock halign-left valign-top">Private</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top" rowspan="2"><p class="tableblock"><strong>Host</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Allocation</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Dynamic</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Dynamic</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Dynamic</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">None</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Access</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Read/Write to Buffers and Images, but not Pipes</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Read/Write</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">None</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">None</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top" rowspan="2"><p class="tableblock"><strong>Kernel</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Allocation</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Static (program scope variables)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Static (program scope variables)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Static for parent kernel, |
| Dynamic for child kernels</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Static</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Access</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Read/Write</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Read-only</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Read/Write, |
| No access to child kernel memory</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Read/Write</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>The <a href="#memory-regions-table">Memory Regions</a> table shows the different |
| memory regions in OpenCL and how memory objects are allocated and accessed |
| by the host and by an executing instance of a kernel. |
| For kernels, we distinguish between the behavior of local memory |
| for a parent kernel and its child kernels.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Once allocated, a memory object is made available to kernel-instances |
| running on one or more devices. |
| In addition to <a href="#shared-virtual-memory">Shared Virtual Memory</a>, there are |
| three basic ways to manage the contents of buffers between the host and |
| devices.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Read/Write/Fill commands</strong>: The data associated with a memory object is |
| explicitly read and written between the host and global memory regions |
| using commands enqueued to an OpenCL command queue. |
| Note: Fill commands are <a href="#unified-spec">missing before</a> version 1.2.</p> |
| </li> |
| <li> |
| <p><strong>Map/Unmap commands</strong>: Data from the memory object is mapped into a |
| contiguous block of memory accessed through a host accessible pointer. |
| The host program enqueues a <em>map</em> command on block of a memory object |
| before it can be safely manipulated by the host program. |
| When the host program is finished working with the block of memory, the |
| host program enqueues an <em>unmap</em> command to allow a kernel-instance to |
| safely read and/or write the buffer.</p> |
| </li> |
| <li> |
| <p><strong>Copy commands:</strong> The data associated with a memory object is copied |
| between two buffers, each of which may reside either on the host or on |
| the device.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>With Read/Write/Map, the commands |
| can be blocking or non-blocking operations. |
| The OpenCL function call for a blocking memory transfer returns once the |
| command (memory transfer) has completed. At this point the associated memory |
| resources on the host can be safely reused, and following operations on the host are |
| guaranteed that the transfer has already completed. |
| For a non-blocking memory transfer, the OpenCL function call returns as soon |
| as the command is enqueued.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Memory objects are bound to a context and hence can appear in multiple |
| kernel-instances running on more than one physical device. |
| The OpenCL platform must support a large range of hardware platforms |
| including systems that do not support a single shared address space in |
| hardware; hence the ways memory objects can be shared between |
| kernel-instances is restricted. |
| The basic principle is that multiple read operations on memory objects from |
| multiple kernel-instances that overlap in time are allowed, but mixing |
| overlapping reads and writes into the same memory objects from different |
| kernel instances is only allowed when fine grained synchronization is used |
| with <a href="#shared-virtual-memory">Shared Virtual Memory</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>When global memory is manipulated by multiple kernel-instances running on |
| multiple devices, the OpenCL runtime system must manage the association of |
| memory objects with a given device. |
| In most cases the OpenCL runtime will implicitly associate a memory object |
| with a device. |
| A kernel instance is naturally associated with the command queue to which |
| the kernel was submitted. |
| Since a command-queue can only access a single device, the queue uniquely |
| defines which device is involved with any given kernel-instance; hence |
| defining a clear association between memory objects, kernel-instances and |
| devices. |
| Programmers may anticipate these associations in their programs and |
| explicitly manage association of memory objects with devices in order to |
| improve performance.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="shared-virtual-memory"><a class="anchor" href="#shared-virtual-memory"></a>3.3.3. Shared Virtual Memory</h4> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| Shared virtual memory is <a href="#unified-spec">missing before</a> |
| version 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL extends the global memory region into the host memory region through |
| a shared virtual memory (SVM) mechanism. |
| There are three types of SVM in OpenCL</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>Coarse-Grained buffer SVM</strong>: Sharing occurs at the granularity of |
| regions of OpenCL buffer memory objects. |
| Consistency is enforced at synchronization points and with map/unmap |
| commands to drive updates between the host and the device. |
| This form of SVM is similar to non-SVM use of memory; however, it lets |
| kernel-instances share pointer-based data structures (such as |
| linked-lists) with the host program. |
| Program scope global variables are treated as per-device coarse-grained |
| SVM for addressing and sharing purposes.</p> |
| </li> |
| <li> |
| <p><strong>Fine-Grained buffer SVM</strong>: Sharing occurs at the granularity of |
| individual loads/stores into bytes within OpenCL buffer memory objects. |
| Loads and stores may be cached. |
| This means consistency is guaranteed at synchronization points. |
| If the optional OpenCL atomics are supported, they can be used to |
| provide fine-grained control of memory consistency.</p> |
| </li> |
| <li> |
| <p><strong>Fine-Grained system SVM</strong>: Sharing occurs at the granularity of |
| individual loads/stores into bytes occurring anywhere within the host |
| memory. |
| Loads and stores may be cached so consistency is guaranteed at |
| synchronization points. |
| If the optional OpenCL atomics are supported, they can be used to |
| provide fine-grained control of memory consistency.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="svm-summary-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 2. A summary of shared virtual memory (SVM) options in OpenCL</caption> |
| <colgroup> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-center valign-top"></th> |
| <th class="tableblock halign-center valign-top">Granularity of sharing</th> |
| <th class="tableblock halign-center valign-top">Memory Allocation</th> |
| <th class="tableblock halign-center valign-top">Mechanisms to enforce Consistency</th> |
| <th class="tableblock halign-center valign-top">Explicit updates between host and device</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Non-SVM buffers</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">OpenCL Memory objects(buffer)</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock"><a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a><br> |
| <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a></p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Host synchronization points on the same or between devices.</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">yes, through Map and Unmap commands.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Coarse-Grained buffer SVM</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">OpenCL Memory objects (buffer)</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock"><a href="#clSVMAlloc"><strong>clSVMAlloc</strong></a></p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Host synchronization points between devices</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">yes, through Map and Unmap commands.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Fine-Grained buffer SVM</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Bytes within OpenCL Memory objects (buffer)</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock"><a href="#clSVMAlloc"><strong>clSVMAlloc</strong></a></p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Synchronization points plus atomics (if supported)</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">No</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Fine-Grained system SVM</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Bytes within Host memory (system)</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Host memory allocation mechanisms (e.g. malloc)</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">Synchronization points plus atomics (if supported)</p></td> |
| <td class="tableblock halign-center valign-top"><p class="tableblock">No</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>Coarse-Grained buffer SVM is required in the core OpenCL specification. |
| The two finer grained approaches are optional features in OpenCL. |
| The various SVM mechanisms to access host memory from the work-items |
| associated with a kernel instance are <a href="#svm-summary-table">summarized |
| above</a>.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_memory_consistency_model_for_opencl_1_x"><a class="anchor" href="#_memory_consistency_model_for_opencl_1_x"></a>3.3.4. Memory Consistency Model for OpenCL 1.x</h4> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| This memory consistency model is <a href="#unified-spec">deprecated |
| by</a> version 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL 1.x uses a relaxed consistency memory model; i.e. the state of memory |
| visible to a work-item is not guaranteed to be consistent across the collection |
| of work-items at all times.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Within a work-item memory has load / store consistency. |
| Local memory is consistent across work-items in a single work-group at a |
| work-group barrier. |
| Global memory is consistent across work-items in a single work-group at a |
| work-group barrier, but there are no guarantees of memory consistency between |
| different work-groups executing a kernel.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Memory consistency for memory objects shared between enqueued commands is |
| enforced at a synchronization point.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="memory-consistency-model"><a class="anchor" href="#memory-consistency-model"></a>3.3.5. Memory Consistency Model for OpenCL 2.x</h4> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| This memory consistency model is <a href="#unified-spec">missing |
| before</a> version 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>The OpenCL 2.x memory model tells programmers what they can expect from an |
| OpenCL 2.x implementation; which memory operations are guaranteed to happen in |
| which order and which memory values each read operation will return. |
| The memory model tells compiler writers which restrictions they must follow |
| when implementing compiler optimizations; which variables they can cache in |
| registers and when they can move reads or writes around a barrier or atomic |
| operation. |
| The memory model also tells hardware designers about limitations on hardware |
| optimizations; for example, when they must flush or invalidate hardware |
| caches.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The memory consistency model in OpenCL 2.x is based on the memory model from |
| the ISO C11 programming language. |
| To help make the presentation more precise and self-contained, we include |
| modified paragraphs taken verbatim from the ISO C11 international standard. |
| When a paragraph is taken or modified from the C11 standard, it is |
| identified as such along with its original location in the <a href="#iso-c11">C11 |
| standard</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For programmers, the most intuitive model is the <em>sequential consistency</em> |
| memory model. |
| Sequential consistency interleaves the steps executed by each of the units |
| of execution. |
| Each access to a memory location sees the last assignment to that location |
| in that interleaving. |
| While sequential consistency is relatively straightforward for a programmer |
| to reason about, implementing sequential consistency is expensive. |
| Therefore, OpenCL 2.x implements a relaxed memory consistency model; i.e. it is |
| possible to write programs where the loads from memory violate sequential |
| consistency. |
| Fortunately, if a program does not contain any races and if the program only |
| uses atomic operations that utilize the sequentially consistent memory order |
| (the default memory ordering for OpenCL 2.x), OpenCL programs appear to execute |
| with sequential consistency.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Programmers can to some degree control how the memory model is relaxed by |
| choosing the memory order for synchronization operations. |
| The precise semantics of synchronization and the memory orders are formally |
| defined in <a href="#memory-ordering-rules">Memory Ordering Rules</a>. |
| Here, we give a high level description of how these memory orders apply to |
| atomic operations on atomic objects shared between units of execution. |
| OpenCL 2.x memory_order choices are based on those from the ISO C11 standard |
| memory model. |
| They are specified in certain OpenCL functions through the following |
| enumeration constants:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>memory_order_relaxed</strong>: implies no order constraints. |
| This memory order can be used safely to increment counters that are |
| concurrently incremented, but it doesn’t guarantee anything about the |
| ordering with respect to operations to other memory locations. |
| It can also be used, for example, to do ticket allocation and by expert |
| programmers implementing lock-free algorithms.</p> |
| </li> |
| <li> |
| <p><strong>memory_order_acquire</strong>: A synchronization operation (fence or atomic) |
| that has acquire semantics "acquires" side-effects from a release |
| operation that synchronises with it: if an acquire synchronises with a |
| release, the acquiring unit of execution will see all side-effects |
| preceding that release (and possibly subsequent side-effects.) As part |
| of carefully-designed protocols, programmers can use an "acquire" to |
| safely observe the work of another unit of execution.</p> |
| </li> |
| <li> |
| <p><strong>memory_order_release</strong>: A synchronization operation (fence or atomic |
| operation) that has release semantics "releases" side effects to an |
| acquire operation that synchronises with it. |
| All side effects that precede the release are included in the release. |
| As part of carefully-designed protocols, programmers can use a "release" |
| to make changes made in one unit of execution visible to other units of |
| execution.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| In general, no acquire must <em>always</em> synchronise with any particular |
| release. |
| However, synchronisation can be forced by certain executions. |
| See the description of <a href="#memory-ordering-fence">Fence Operations</a> for |
| detailed rules for when synchronisation must occur. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>memory_order_acq_rel</strong>: A synchronization operation with acquire-release |
| semantics has the properties of both the acquire and release memory |
| orders. |
| It is typically used to order read-modify-write operations.</p> |
| </li> |
| <li> |
| <p><strong>memory_order_seq_cst</strong>: The loads and stores of each unit of execution |
| appear to execute in program (i.e., sequenced-before) order, and the |
| loads and stores from different units of execution appear to be simply |
| interleaved.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Regardless of which memory_order is specified, resolving constraints on |
| memory operations across a heterogeneous platform adds considerable overhead |
| to the execution of a program. |
| An OpenCL platform may be able to optimize certain operations that depend on |
| the features of the memory consistency model by restricting the scope of the |
| memory operations. |
| Distinct memory scopes are defined by the values of the memory_scope |
| enumeration constant:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>memory_scope_work_item</strong>: memory-ordering constraints only apply within |
| the work-item <sup class="footnote">[<a id="_footnoteref_1" class="footnote" href="#_footnotedef_1" title="View footnote.">1</a>]</sup>.</p> |
| </li> |
| <li> |
| <p><strong>memory_scope_sub_group</strong>: memory-ordering constraints only apply within |
| the sub-group.</p> |
| </li> |
| <li> |
| <p><strong>memory_scope_work_group</strong>: memory-ordering constraints only apply to |
| work-items executing within a single work-group.</p> |
| </li> |
| <li> |
| <p><strong>memory_scope_device:</strong> memory-ordering constraints only apply to |
| work-items executing on a single device</p> |
| </li> |
| <li> |
| <p><strong>memory_scope_all_svm_devices</strong>: memory-ordering constraints apply to |
| work-items executing across multiple devices and (when using SVM) the |
| host. |
| A release performed with <strong>memory_scope_all_svm_devices</strong> to a buffer that |
| does not have the <a href="#CL_MEM_SVM_ATOMICS"><code>CL_MEM_<wbr>SVM_<wbr>ATOMICS</code></a> flag set will commit to at least |
| <strong>memory_scope_device</strong> visibility, with full synchronization of the |
| buffer at a queue synchronization point (e.g. an OpenCL event).</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>These memory scopes define a hierarchy of visibilities when analyzing the |
| ordering constraints of memory operations. |
| For example if a programmer knows that a sequence of memory operations will |
| only be associated with a collection of work-items from a single work-group |
| (and hence will run on a single device), the implementation is spared the |
| overhead of managing the memory orders across other devices within the same |
| context. |
| This can substantially reduce overhead in a program. |
| All memory scopes are valid when used on global memory or local memory. |
| For local memory, all visibility is constrained to within a given work-group |
| and scopes wider than <strong>memory_scope_work_group</strong> carry no additional meaning.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In the following subsections (leading up to <a href="#opencl-framework">OpenCL |
| Framework</a>), we will explain the synchronization constructs and detailed |
| rules needed to use OpenCL’s 2.x relaxed memory models. |
| It is important to appreciate, however, that many programs do not benefit |
| from relaxed memory models. |
| Even expert programmers have a difficult time using atomics and fences to |
| write correct programs with relaxed memory models. |
| A large number of OpenCL programs can be written using a simplified memory |
| model. |
| This is accomplished by following these guidelines.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>Write programs that manage safe sharing of global memory objects through |
| the synchronization points defined by the command queues.</p> |
| </li> |
| <li> |
| <p>Restrict low level synchronization inside work-groups to the work-group |
| functions such as barrier.</p> |
| </li> |
| <li> |
| <p>If you want sequential consistency behavior with system allocations or |
| fine-grain SVM buffers with atomics support, use only |
| <strong>memory_order_seq_cst</strong> operations with the scope |
| <strong>memory_scope_all_svm_devices</strong>.</p> |
| </li> |
| <li> |
| <p>If you want sequential consistency behavior when not using system |
| allocations or fine-grain SVM buffers with atomics support, use only |
| <strong>memory_order_seq_cst</strong> operations with the scope <strong>memory_scope_device</strong> |
| or <strong>memory_scope_all_svm_devices</strong>.</p> |
| </li> |
| <li> |
| <p>Ensure your program has no races.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If these guidelines are followed in your OpenCL programs, you can skip the |
| detailed rules behind the relaxed memory models and go directly to |
| <a href="#opencl-framework">OpenCL Framework</a>.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_overview_of_atomic_and_fence_operations"><a class="anchor" href="#_overview_of_atomic_and_fence_operations"></a>3.3.6. Overview of atomic and fence operations</h4> |
| <div class="paragraph"> |
| <p>OpenCL 2.x has a number of <em>synchronization operations</em> that are used to define |
| memory order constraints in a program. |
| They play a special role in controlling how memory operations in one unit of |
| execution (such as work-items or, when using SVM a host thread) are made |
| visible to another. |
| There are two types of synchronization operations in OpenCL; <em>atomic |
| operations</em> and <em>fences</em>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Atomic operations are indivisible. |
| They either occur completely or not at all. |
| These operations are used to order memory operations between units of |
| execution and hence they are parameterized with the memory_order and |
| memory_scope parameters defined by the OpenCL memory consistency model. |
| The atomic operations for OpenCL kernel languages are similar to the |
| corresponding operations defined by the C11 standard.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The OpenCL 2.x atomic operations apply to variables of an atomic type (a |
| subset of those in the C11 standard) including atomic versions of the int, |
| uint, long, ulong, float, double, half, intptr_t, uintptr_t, size_t, and |
| ptrdiff_t types. |
| However, support for some of these atomic types depends on support for the |
| corresponding regular types.</p> |
| </div> |
| <div class="paragraph"> |
| <p>An atomic operation on one or more memory locations is either an acquire |
| operation, a release operation, or both an acquire and release operation. |
| An atomic operation without an associated memory location is a fence and can |
| be either an acquire fence, a release fence, or both an acquire and release |
| fence. |
| In addition, there are relaxed atomic operations, which do not have |
| synchronization properties, and atomic read-modify-write operations, which |
| have special characteristics. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 5, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>The orders <strong>memory_order_acquire</strong> (used for reads), <strong>memory_order_release</strong> |
| (used for writes), and <strong>memory_order_acq_rel</strong> (used for read-modify-write |
| operations) are used for simple communication between units of execution |
| using shared variables. |
| Informally, executing a <strong>memory_order_release</strong> on an atomic object A makes |
| all previous side effects visible to any unit of execution that later |
| executes a <strong>memory_order_acquire</strong> on A. |
| The orders <strong>memory_order_acquire</strong>, <strong>memory_order_release</strong>, and |
| <strong>memory_order_acq_rel</strong> do not provide sequential consistency for race-free |
| programs because they will not ensure that atomic stores followed by atomic |
| loads become visible to other threads in that order.</p> |
| </div> |
| <div id="atomic-fence-orders" class="paragraph"> |
| <p>The fence operation is atomic_work_item_fence, which includes a memory_order |
| argument as well as the memory_scope and cl_mem_fence_flags arguments. |
| Depending on the memory_order argument, this operation:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>has no effects, if <strong>memory_order_relaxed</strong>;</p> |
| </li> |
| <li> |
| <p>is an acquire fence, if <strong>memory_order_acquire</strong>;</p> |
| </li> |
| <li> |
| <p>is a release fence, if <strong>memory_order_release</strong>;</p> |
| </li> |
| <li> |
| <p>is both an acquire fence and a release fence, if <strong>memory_order_acq_rel</strong>;</p> |
| </li> |
| <li> |
| <p>is a sequentially-consistent fence with both acquire and release |
| semantics, if <strong>memory_order_seq_cst</strong>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If specified, the cl_mem_fence_flags argument must be <code>CLK_IMAGE_MEM_FENCE</code>, |
| <code>CLK_GLOBAL_MEM_FENCE</code>, <code>CLK_LOCAL_MEM_FENCE</code>, or <code>CLK_GLOBAL_MEM_FENCE | |
| CLK_LOCAL_MEM_FENCE</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The <code>atomic_work_item_fence(CLK_IMAGE_MEM_FENCE, …​)</code> built-in function must be |
| used to make sure that sampler-less writes are visible to later reads by the |
| same work-item. |
| Without use of the atomic_work_item_fence function, write-read coherence on |
| image objects is not guaranteed: if a work-item reads from an image to which |
| it has previously written without an intervening atomic_work_item_fence, it |
| is not guaranteed that those previous writes are visible to the work-item.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The synchronization operations in OpenCL 2.x can be parameterized by a |
| memory_scope. |
| Memory scopes control the extent that an atomic operation or fence is |
| visible with respect to the memory model. |
| These memory scopes may be used when performing atomic operations and fences |
| on global memory and local memory. |
| When used on global memory visibility is bounded by the capabilities of that |
| memory. |
| When used on a fine-grained non-atomic SVM buffer, a coarse-grained SVM |
| buffer, or a non-SVM buffer, operations parameterized with |
| <strong>memory_scope_all_svm_devices</strong> will behave as if they were parameterized |
| with <strong>memory_scope_device</strong>. |
| When used on local memory, visibility is bounded by the work-group and, as a |
| result, memory_scope with wider visibility than <strong>memory_scope_work_group</strong> |
| will be reduced to <strong>memory_scope_work_group</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Two actions <strong>A</strong> and <strong>B</strong> are defined to have an inclusive scope if they have |
| the same scope <strong>P</strong> such that:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>P</strong> is <strong>memory_scope_sub_group</strong> and <strong>A</strong> and <strong>B</strong> are executed by |
| work-items within the same sub-group.</p> |
| </li> |
| <li> |
| <p><strong>P</strong> is <strong>memory_scope_work_group</strong> and <strong>A</strong> and <strong>B</strong> are executed by |
| work-items within the same work-group.</p> |
| </li> |
| <li> |
| <p><strong>P</strong> is <strong>memory_scope_device</strong> and <strong>A</strong> and <strong>B</strong> are executed by work-items |
| on the same device when <strong>A</strong> and <strong>B</strong> apply to an SVM allocation or <strong>A</strong> |
| and <strong>B</strong> are executed by work-items in the same kernel or one of its |
| children when <strong>A</strong> and <strong>B</strong> apply to a <code>cl_mem</code> buffer.</p> |
| </li> |
| <li> |
| <p><strong>P</strong> is <strong>memory_scope_all_svm_devices</strong> if <strong>A</strong> and <strong>B</strong> are executed by |
| host threads or by work-items on one or more devices that can share SVM |
| memory with each other and the host process.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="memory-ordering-rules"><a class="anchor" href="#memory-ordering-rules"></a>3.3.7. Memory Ordering Rules</h4> |
| <div class="paragraph"> |
| <p>Fundamentally, the issue in a memory model is to understand the orderings in |
| time of modifications to objects in memory. |
| Modifying an object or calling a function that modifies an object are side |
| effects, i.e. changes in the state of the execution environment. |
| Evaluation of an expression in general includes both value computations and |
| initiation of side effects. |
| Value computation for an lvalue expression includes determining the identity |
| of the designated object. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.3, paragraph 2, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>We assume that the OpenCL kernel language and host programming languages |
| have a sequenced-before relation between the evaluations executed by a |
| single unit of execution. |
| This sequenced-before relation is an asymmetric, transitive, pair-wise |
| relation between those evaluations, which induces a partial order among |
| them. |
| Given any two evaluations <strong>A</strong> and <strong>B</strong>, if <strong>A</strong> is sequenced-before <strong>B</strong>, then |
| the execution of <strong>A</strong> shall precede the execution of <strong>B</strong>. |
| (Conversely, if <strong>A</strong> is sequenced-before <strong>B</strong>, then <strong>B</strong> is sequenced-after |
| <strong>A</strong>.) If <strong>A</strong> is not sequenced-before or sequenced-after <strong>B</strong>, then <strong>A</strong> and |
| <strong>B</strong> are unsequenced. |
| Evaluations <strong>A</strong> and <strong>B</strong> are indeterminately sequenced when <strong>A</strong> is either |
| sequenced-before or sequenced-after <strong>B</strong>, but it is unspecified which. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.3, paragraph 3, modified.]</a></p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Sequenced-before is a partial order of the operations executed by a |
| single unit of execution (e.g. a host thread or work-item). |
| It generally corresponds to the source program order of those operations, and |
| is partial because of the undefined argument evaluation order of the OpenCL C |
| kernel language. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>In an OpenCL kernel language, the value of an object visible to a work-item |
| W at a particular point is the initial value of the object, a value stored |
| in the object by W, or a value stored in the object by another work-item or |
| host thread, according to the rules below. |
| Depending on details of the host programming language, the value of an |
| object visible to a host thread may also be the value stored in that object |
| by another work-item or host thread. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 2, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>Two expression evaluations conflict if one of them modifies a memory |
| location and the other one reads or modifies the same memory location. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 4.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>All modifications to a particular atomic object <strong>M</strong> occur in some particular |
| total order, called the modification order of <strong>M</strong>. |
| If <strong>A</strong> and <strong>B</strong> are modifications of an atomic object <strong>M</strong>, and <strong>A</strong> |
| happens-before <strong>B</strong>, then <strong>A</strong> shall precede <strong>B</strong> in the modification order of |
| <strong>M</strong>, which is defined below. |
| Note that the modification order of an atomic object <strong>M</strong> is independent of |
| whether <strong>M</strong> is in local or global memory. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 7, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>A release sequence begins with a release operation <strong>A</strong> on an atomic object |
| <strong>M</strong> and is the maximal contiguous sub-sequence of side effects in the |
| modification order of <strong>M</strong>, where the first operation is <strong>A</strong> and every |
| subsequent operation either is performed by the same work-item or host |
| thread that performed the release or is an atomic read-modify-write |
| operation. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 10, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL’s local and global memories are disjoint. |
| Kernels may access both kinds of memory while host threads may only access |
| global memory. |
| Furthermore, the <em>flags</em> argument of OpenCL’s work_group_barrier function |
| specifies which memory operations the function will make visible: these |
| memory operations can be, for example, just the ones to local memory, or the |
| ones to global memory, or both. |
| Since the visibility of memory operations can be specified for local memory |
| separately from global memory, we define two related but independent |
| relations, <em>global-synchronizes-with</em> and <em>local-synchronizes-with</em>. |
| Certain operations on global memory may global-synchronize-with other |
| operations performed by another work-item or host thread. |
| An example is a release atomic operation in one work- item that |
| global-synchronizes-with an acquire atomic operation in a second work-item. |
| Similarly, certain atomic operations on local objects in kernels can |
| local-synchronize- with other atomic operations on those local objects. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 11, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>We define two separate happens-before relations: global-happens-before and |
| local-happens-before.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A global memory action <strong>A</strong> global-happens-before a global memory action <strong>B</strong> |
| if</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>A</strong> is sequenced before <strong>B</strong>, or</p> |
| </li> |
| <li> |
| <p><strong>A</strong> global-synchronizes-with <strong>B</strong>, or</p> |
| </li> |
| <li> |
| <p>For some global memory action <strong>C</strong>, <strong>A</strong> global-happens-before <strong>C</strong> and <strong>C</strong> |
| global-happens-before <strong>B</strong>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>A local memory action <strong>A</strong> local-happens-before a local memory action <strong>B</strong> if</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>A</strong> is sequenced before <strong>B</strong>, or</p> |
| </li> |
| <li> |
| <p><strong>A</strong> local-synchronizes-with <strong>B</strong>, or</p> |
| </li> |
| <li> |
| <p>For some local memory action <strong>C</strong>, <strong>A</strong> local-happens-before <strong>C</strong> and <strong>C</strong> |
| local-happens-before <strong>B</strong>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>An OpenCL 2.x implementation shall ensure that no program execution |
| demonstrates a cycle in either the local-happens-before relation or the |
| global-happens-before relation.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| The global- and local-happens-before relations are critical to |
| defining what values are read and when data races occur. |
| The global-happens-before relation, for example, defines what global memory |
| operations definitely happen before what other global memory operations. |
| If an operation <strong>A</strong> global-happens-before operation <strong>B</strong> then <strong>A</strong> must occur |
| before <strong>B</strong>; in particular, any write done by <strong>A</strong> will be visible to <strong>B</strong>. |
| The local-happens-before relation has similar properties for local memory. |
| Programmers can use the local- and global-happens-before relations to reason |
| about the order of program actions. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>A visible side effect <strong>A</strong> on a global object <strong>M</strong> with respect to a value |
| computation <strong>B</strong> of <strong>M</strong> satisfies the conditions:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>A</strong> global-happens-before <strong>B</strong>, and</p> |
| </li> |
| <li> |
| <p>there is no other side effect <strong>X</strong> to <strong>M</strong> such that <strong>A</strong> |
| global-happens-before <strong>X</strong> and <strong>X</strong> global-happens-before <strong>B</strong>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>We define visible side effects for local objects <strong>M</strong> similarly. |
| The value of a non-atomic scalar object <strong>M</strong>, as determined by evaluation |
| <strong>B</strong>, shall be the value stored by the visible side effect <strong>A</strong>. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 19, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>The execution of a program contains a data race if it contains two |
| conflicting actions <strong>A</strong> and <strong>B</strong> in different units of execution, and</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>(1) at least one of <strong>A</strong> or <strong>B</strong> is not atomic, or <strong>A</strong> and <strong>B</strong> do not have |
| inclusive memory scope, and</p> |
| </li> |
| <li> |
| <p>(2) the actions are global actions unordered by the |
| global-happens-before relation or are local actions unordered by the |
| local-happens-before relation.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Any such data race results in undefined behavior. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 25, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>We also define the visible sequence of side effects on local and global |
| atomic objects. |
| The remaining paragraphs of this subsection define this sequence for a |
| global atomic object <strong>M</strong>; the visible sequence of side effects for a local |
| atomic object is defined similarly by using the local-happens-before |
| relation.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The visible sequence of side effects on a global atomic object <strong>M</strong>, with |
| respect to a value computation <strong>B</strong> of <strong>M</strong>, is a maximal contiguous |
| sub-sequence of side effects in the modification order of <strong>M</strong>, where the |
| first side effect is visible with respect to <strong>B</strong>, and for every side effect, |
| it is not the case that <strong>B</strong> global-happens-before it. |
| The value of <strong>M</strong>, as determined by evaluation <strong>B</strong>, shall be the value stored |
| by some operation in the visible sequence of <strong>M</strong> with respect to <strong>B</strong>. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 22, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>If an operation <strong>A</strong> that modifies an atomic object <strong>M</strong> global-happens before |
| an operation <strong>B</strong> that modifies <strong>M</strong>, then <strong>A</strong> shall be earlier than <strong>B</strong> in |
| the modification order of <strong>M</strong>. |
| This requirement is known as write-write coherence.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If a value computation <strong>A</strong> of an atomic object <strong>M</strong> global-happens-before a |
| value computation <strong>B</strong> of <strong>M</strong>, and <strong>A</strong> takes its value from a side effect <strong>X</strong> |
| on <strong>M</strong>, then the value computed by <strong>B</strong> shall either equal the value stored |
| by <strong>X</strong>, or be the value stored by a side effect <strong>Y</strong> on <strong>M</strong>, where <strong>Y</strong> |
| follows <strong>X</strong> in the modification order of <strong>M</strong>. |
| This requirement is known as read-read coherence. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 22, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>If a value computation <strong>A</strong> of an atomic object <strong>M</strong> global-happens-before an |
| operation <strong>B</strong> on <strong>M</strong>, then <strong>A</strong> shall take its value from a side effect <strong>X</strong> |
| on <strong>M</strong>, where <strong>X</strong> precedes <strong>B</strong> in the modification order of <strong>M</strong>. |
| This requirement is known as read-write coherence.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If a side effect <strong>X</strong> on an atomic object <strong>M</strong> global-happens-before a value |
| computation <strong>B</strong> of <strong>M</strong>, then the evaluation <strong>B</strong> shall take its value from |
| <strong>X</strong> or from a side effect <strong>Y</strong> that follows <strong>X</strong> in the modification order of |
| <strong>M</strong>. |
| This requirement is known as write-read coherence.</p> |
| </div> |
| <div class="sect4"> |
| <h5 id="_atomic_operations"><a class="anchor" href="#_atomic_operations"></a>3.3.7.1. Atomic Operations</h5> |
| <div class="paragraph"> |
| <p>This and following sections describe how different program actions in kernel |
| C code and the host program contribute to the local- and |
| global-happens-before relations. |
| This section discusses ordering rules for OpenCL 2.x atomic operations.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#device-side-enqueue">Device-side enqueue</a> defines the enumerated type |
| memory_order.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>For <strong>memory_order_relaxed</strong>, no operation orders memory.</p> |
| </li> |
| <li> |
| <p>For <strong>memory_order_release</strong>, <strong>memory_order_acq_rel</strong>, and |
| <strong>memory_order_seq_cst</strong>, a store operation performs a release operation |
| on the affected memory location.</p> |
| </li> |
| <li> |
| <p>For <strong>memory_order_acquire</strong>, <strong>memory_order_acq_rel</strong>, and |
| <strong>memory_order_seq_cst</strong>, a load operation performs an acquire operation |
| on the affected memory location. |
| <a href="#iso-c11">[C11 standard, Section 7.17.3, paragraphs 2-4, modified.]</a></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Certain built-in functions synchronize with other built-in functions |
| performed by another unit of execution. |
| This is true for pairs of release and acquire operations under specific |
| circumstances. |
| An atomic operation <strong>A</strong> that performs a release operation on a global object |
| <strong>M</strong> global-synchronizes-with an atomic operation <strong>B</strong> that performs an |
| acquire operation on <strong>M</strong> and reads a value written by any side effect in the |
| release sequence headed by <strong>A</strong>. |
| A similar rule holds for atomic operations on objects in local memory: an |
| atomic operation <strong>A</strong> that performs a release operation on a local object <strong>M</strong> |
| local-synchronizes-with an atomic operation <strong>B</strong> that performs an acquire |
| operation on <strong>M</strong> and reads a value written by any side effect in the release |
| sequence headed by <strong>A</strong>. |
| <a href="#iso-c11">[C11 standard, Section 5.1.2.4, paragraph 11, modified.]</a></p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Atomic operations specifying <strong>memory_order_relaxed</strong> are relaxed only |
| with respect to memory ordering. |
| Implementations must still guarantee that any given atomic access to a |
| particular atomic object be indivisible with respect to all other atomic |
| accesses to that object. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>There shall exist a single total order <strong>S</strong> for all <strong>memory_order_seq_cst</strong> |
| operations that is consistent with the modification orders for all affected |
| locations, as well as the appropriate global-happens-before and |
| local-happens-before orders for those locations, such that each |
| <strong>memory_order_seq_cst</strong> operation <strong>B</strong> that loads a value from an atomic object |
| <strong>M</strong> in global or local memory observes one of the following values:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>the result of the last modification <strong>A</strong> of <strong>M</strong> that precedes <strong>B</strong> in <strong>S</strong>, |
| if it exists, or</p> |
| </li> |
| <li> |
| <p>if <strong>A</strong> exists, the result of some modification of <strong>M</strong> in the visible |
| sequence of side effects with respect to <strong>B</strong> that is not |
| <strong>memory_order_seq_cst</strong> and that does not happen before <strong>A</strong>, or</p> |
| </li> |
| <li> |
| <p>if <strong>A</strong> does not exist, the result of some modification of <strong>M</strong> in the |
| visible sequence of side effects with respect to <strong>B</strong> that is not |
| <strong>memory_order_seq_cst</strong>. |
| <a href="#iso-c11">[C11 standard, Section 7.17.3, paragraph 6, modified.]</a></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Let X and Y be two <strong>memory_order_seq_cst</strong> operations. |
| If X local-synchronizes-with or global-synchronizes-with Y then X both |
| local-synchronizes-with Y and global-synchronizes-with Y.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If the total order <strong>S</strong> exists, the following rules hold:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>For an atomic operation <strong>B</strong> that reads the value of an atomic object |
| <strong>M</strong>, if there is a <strong>memory_order_seq_cst</strong> fence <strong>X</strong> sequenced-before |
| <strong>B</strong>, then <strong>B</strong> observes either the last <strong>memory_order_seq_cst</strong> |
| modification of <strong>M</strong> preceding <strong>X</strong> in the total order <strong>S</strong> or a later |
| modification of <strong>M</strong> in its modification order. |
| <a href="#iso-c11">[C11 standard, Section 7.17.3, paragraph 9.]</a></p> |
| </li> |
| <li> |
| <p>For atomic operations <strong>A</strong> and <strong>B</strong> on an atomic object <strong>M</strong>, where <strong>A</strong> |
| modifies <strong>M</strong> and <strong>B</strong> takes its value, if there is a |
| <strong>memory_order_seq_cst</strong> fence <strong>X</strong> such that <strong>A</strong> is sequenced-before <strong>X</strong> |
| and <strong>B</strong> follows <strong>X</strong> in <strong>S</strong>, then <strong>B</strong> observes either the effects of <strong>A</strong> |
| or a later modification of <strong>M</strong> in its modification order. |
| <a href="#iso-c11">[C11 standard, Section 7.17.3, paragraph 10.]</a></p> |
| </li> |
| <li> |
| <p>For atomic operations <strong>A</strong> and <strong>B</strong> on an atomic object <strong>M</strong>, where <strong>A</strong> |
| modifies <strong>M</strong> and <strong>B</strong> takes its value, if there are |
| <strong>memory_order_seq_cst</strong> fences <strong>X</strong> and <strong>Y</strong> such that <strong>A</strong> is |
| sequenced-before <strong>X</strong>, <strong>Y</strong> is sequenced-before <strong>B</strong>, and <strong>X</strong> precedes <strong>Y</strong> |
| in <strong>S</strong>, then <strong>B</strong> observes either the effects of <strong>A</strong> or a later |
| modification of <strong>M</strong> in its modification order. |
| <a href="#iso-c11">[C11 standard, Section 7.17.3, paragraph 11.]</a></p> |
| </li> |
| <li> |
| <p>For atomic operations <strong>A</strong> and <strong>B</strong> on an atomic object <strong>M</strong>, if there are |
| <strong>memory_order_seq_cst</strong> fences <strong>X</strong> and <strong>Y</strong> such that <strong>A</strong> is |
| sequenced-before <strong>X</strong>, <strong>Y</strong> is sequenced-before <strong>B</strong>, and <strong>X</strong> precedes <strong>Y</strong> |
| in <strong>S</strong>, then <strong>B</strong> occurs later than <strong>A</strong> in the modification order of <strong>M</strong>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <strong>memory_order_seq_cst</strong> ensures sequential consistency only for a |
| program that is (1) free of data races, and (2) exclusively uses |
| <strong>memory_order_seq_cst</strong> synchronization operations. |
| Any use of weaker ordering will invalidate this guarantee unless extreme |
| care is used. |
| In particular, <strong>memory_order_seq_cst</strong> fences ensure a total order only for |
| the fences themselves. |
| Fences cannot, in general, be used to restore sequential consistency for |
| atomic operations with weaker ordering specifications. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>Atomic read-modify-write operations should always read the last value (in |
| the modification order) stored before the write associated with the |
| read-modify-write operation. |
| <a href="#iso-c11">[C11 standard, Section 7.17.3, paragraph 12.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p><span class="underline">Implementations should ensure that no "out-of-thin-air" values |
| are computed that circularly depend on their own computation.</span></p> |
| </div> |
| <div class="paragraph"> |
| <p>Note: Under the rules described above, and independent to the previously |
| footnoted C++ issue, it is known that <em>x == y == 42</em> is a valid final state |
| in the following problematic example:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c">global atomic_int x = ATOMIC_VAR_INIT(<span class="integer">0</span>); |
| local atomic_int y = ATOMIC_VAR_INIT(<span class="integer">0</span>); |
| |
| <span class="label">unit_of_execution_1:</span> |
| ... [execution not reading or writing x or y, leading up to:] |
| <span class="predefined-type">int</span> t = atomic_load_explicit(&y, memory_order_acquire); |
| atomic_store_explicit(&x, t, memory_order_release); |
| |
| <span class="label">unit_of_execution_2:</span> |
| ... [execution not reading or writing x or y, leading up to:] |
| <span class="predefined-type">int</span> t = atomic_load_explicit(&x, memory_order_acquire); |
| atomic_store_explicit(&y, t, memory_order_release);</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>This is not useful behavior and implementations should not exploit this |
| phenomenon. |
| It should be expected that in the future this may be disallowed by |
| appropriate updates to the memory model description by the OpenCL committee.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Implementations should make atomic stores visible to atomic loads within a |
| reasonable amount of time. |
| <a href="#iso-c11">[C11 standard, Section 7.17.3, paragraph 16.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>As long as the following conditions are met, a host program sharing SVM memory |
| with a kernel executing on one or more OpenCL 2.x devices may use atomic and |
| synchronization operations to ensure that its assignments, and those of the |
| kernel, are visible to each other:</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>Either fine-grained buffer or fine-grained system SVM must be used to |
| share memory. |
| While coarse-grained buffer SVM allocations may support atomic |
| operations, visibility on these allocations is not guaranteed except at |
| map and unmap operations.</p> |
| </li> |
| <li> |
| <p>The optional OpenCL 2.x SVM atomic-controlled visibility specified by |
| provision of the <a href="#CL_MEM_SVM_ATOMICS"><code>CL_MEM_<wbr>SVM_<wbr>ATOMICS</code></a> flag must be supported by the device |
| and the flag provided to the SVM buffer on allocation.</p> |
| </li> |
| <li> |
| <p>The host atomic and synchronization operations must be compatible with |
| those of an OpenCL kernel language. |
| This requires that the size and representation of the data types that |
| the host atomic operations act on be consistent with the OpenCL kernel |
| language atomic types.</p> |
| </li> |
| </ol> |
| </div> |
| <div class="paragraph"> |
| <p>If these conditions are met, the host operations will apply at |
| all_svm_devices scope.</p> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="memory-ordering-fence"><a class="anchor" href="#memory-ordering-fence"></a>3.3.7.2. Fence Operations</h5> |
| <div class="paragraph"> |
| <p>This section describes how the OpenCL 2.x fence operations contribute to the |
| local- and global-happens-before relations.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Earlier, we introduced synchronization primitives called fences. |
| Fences can utilize the acquire memory_order, release memory_order, or both. |
| A fence with acquire semantics is called an acquire fence; a fence with |
| release semantics is called a release fence. The <a href="#atomic-fence-orders">overview of atomic and fence operations</a> section describes the memory orders |
| that result in acquire and release fences.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A global release fence <strong>A</strong> global-synchronizes-with a global acquire fence |
| <strong>B</strong> if there exist atomic operations <strong>X</strong> and <strong>Y</strong>, both operating on some |
| global atomic object <strong>M</strong>, such that <strong>A</strong> is sequenced-before <strong>X</strong>, <strong>X</strong> |
| modifies <strong>M</strong>, <strong>Y</strong> is sequenced-before <strong>B</strong>, <strong>Y</strong> reads the value written by |
| <strong>X</strong> or a value written by any side effect in the hypothetical release |
| sequence <strong>X</strong> would head if it were a release operation, and that the scopes |
| of <strong>A</strong>, <strong>B</strong> are inclusive. |
| <a href="#iso-c11">[C11 standard, Section 7.17.4, paragraph 2, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>A global release fence <strong>A</strong> global-synchronizes-with an atomic operation <strong>B</strong> |
| that performs an acquire operation on a global atomic object <strong>M</strong> if there |
| exists an atomic operation <strong>X</strong> such that <strong>A</strong> is sequenced-before <strong>X</strong>, <strong>X</strong> |
| modifies <strong>M</strong>, <strong>B</strong> reads the value written by <strong>X</strong> or a value written by any |
| side effect in the hypothetical release sequence <strong>X</strong> would head if it were a |
| release operation, and the scopes of <strong>A</strong> and <strong>B</strong> are inclusive. |
| <a href="#iso-c11">[C11 standard, Section 7.17.4, paragraph 3, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>An atomic operation <strong>A</strong> that is a release operation on a global atomic |
| object <strong>M</strong> global-synchronizes-with a global acquire fence <strong>B</strong> if there |
| exists some atomic operation <strong>X</strong> on <strong>M</strong> such that <strong>X</strong> is sequenced-before |
| <strong>B</strong> and reads the value written by <strong>A</strong> or a value written by any side effect |
| in the release sequence headed by <strong>A</strong>, and the scopes of <strong>A</strong> and <strong>B</strong> are |
| inclusive. |
| <a href="#iso-c11">[C11 standard, Section 7.17.4, paragraph 4, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>A local release fence <strong>A</strong> local-synchronizes-with a local acquire fence <strong>B</strong> |
| if there exist atomic operations <strong>X</strong> and <strong>Y</strong>, both operating on some local |
| atomic object <strong>M</strong>, such that <strong>A</strong> is sequenced-before <strong>X</strong>, <strong>X</strong> modifies <strong>M</strong>, |
| <strong>Y</strong> is sequenced-before <strong>B</strong>, and <strong>Y</strong> reads the value written by <strong>X</strong> or a |
| value written by any side effect in the hypothetical release sequence <strong>X</strong> |
| would head if it were a release operation, and the scopes of <strong>A</strong> and <strong>B</strong> are |
| inclusive. |
| <a href="#iso-c11">[C11 standard, Section 7.17.4, paragraph 2, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>A local release fence <strong>A</strong> local-synchronizes-with an atomic operation <strong>B</strong> |
| that performs an acquire operation on a local atomic object <strong>M</strong> if there |
| exists an atomic operation <strong>X</strong> such that <strong>A</strong> is sequenced-before <strong>X</strong>, <strong>X</strong> |
| modifies <strong>M</strong>, and <strong>B</strong> reads the value written by <strong>X</strong> or a value written by |
| any side effect in the hypothetical release sequence <strong>X</strong> would head if it |
| were a release operation, and the scopes of <strong>A</strong> and <strong>B</strong> are inclusive. |
| <a href="#iso-c11">[C11 standard, Section 7.17.4, paragraph 3, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>An atomic operation <strong>A</strong> that is a release operation on a local atomic object |
| <strong>M</strong> local-synchronizes-with a local acquire fence <strong>B</strong> if there exists some |
| atomic operation <strong>X</strong> on <strong>M</strong> such that <strong>X</strong> is sequenced-before <strong>B</strong> and reads |
| the value written by <strong>A</strong> or a value written by any side effect in the |
| release sequence headed by <strong>A</strong>, and the scopes of <strong>A</strong> and <strong>B</strong> are inclusive. |
| <a href="#iso-c11">[C11 standard, Section 7.17.4, paragraph 4, modified.]</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>Let <strong>X</strong> and <strong>Y</strong> be two work-item fences that each have both the |
| <code>CLK_GLOBAL_MEM_FENCE</code> and <code>CLK_LOCAL_MEM_FENCE</code> flags set. |
| <strong>X</strong> global-synchronizes-with <strong>Y</strong> and <strong>X</strong> local synchronizes with <strong>Y</strong> if the |
| conditions required for <strong>X</strong> to global-synchronize with <strong>Y</strong> are met, the |
| conditions required for <strong>X</strong> to local-synchronize-with <strong>Y</strong> are met, or both |
| sets of conditions are met.</p> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="_work_group_functions"><a class="anchor" href="#_work_group_functions"></a>3.3.7.3. Work-group Functions</h5> |
| <div class="paragraph"> |
| <p>The OpenCL kernel execution model includes collective operations across the |
| work-items within a single work-group. |
| These are called work-group functions, and include functions such as |
| barriers, scans, reductions, and broadcasts. |
| We will first discuss the work-group barrier function. |
| Other work-group functions are discussed afterwards.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The barrier function provides a mechanism for a kernel to synchronize the |
| work-items within a single work-group: informally, each work-item of the |
| work-group must execute the barrier before any are allowed to proceed. |
| It also orders memory operations to a specified combination of one or more |
| address spaces such as local memory or global memory, in a similar manner to |
| a fence.</p> |
| </div> |
| <div class="paragraph"> |
| <p>To precisely specify the memory ordering semantics for barrier, we need to |
| distinguish between a dynamic and a static instance of the call to a |
| barrier. |
| A call to a barrier can appear in a loop, for example, and each execution of |
| the same static barrier call results in a new dynamic instance of the |
| barrier that will independently synchronize a work-groups work-items.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A work-item executing a dynamic instance of a barrier results in two |
| operations, both fences, that are called the entry and exit fences. |
| These fences obey all the rules for fences specified elsewhere in this |
| chapter as well as the following:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The entry fence is a release fence with the same flags and scope as |
| requested for the barrier.</p> |
| </li> |
| <li> |
| <p>The exit fence is an acquire fence with the same flags and scope as |
| requested for the barrier.</p> |
| </li> |
| <li> |
| <p>For each work-item the entry fence is sequenced before the exit fence.</p> |
| </li> |
| <li> |
| <p>If the flags have <code>CLK_GLOBAL_MEM_FENCE</code> set then for each work-item the |
| entry fence global-synchronizes-with the exit fence of all other |
| work-items in the same work-group.</p> |
| </li> |
| <li> |
| <p>If the flags have <code>CLK_LOCAL_MEM_FENCE</code> set then for each work-item the |
| entry fence local-synchronizes-with the exit fence of all other |
| work-items in the same work-group.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Other work-group functions include such functions as scans, reductions, |
| and broadcasts, and are described in the kernel language and IL specifications. |
| The use of these work-group functions implies sequenced-before relationships |
| between statements within the execution of a single work-item in order to |
| satisfy data dependencies. |
| For example, a work-item that provides a value to a work-group function must |
| behave as if it generates that value before beginning execution of that |
| work-group function. |
| Furthermore, the programmer must ensure that all work-items in a work-group |
| must execute the same work-group function call site, or dynamic work-group |
| function instance.</p> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="_sub_group_functions"><a class="anchor" href="#_sub_group_functions"></a>3.3.7.4. Sub-group Functions</h5> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Sub-group functions are <a href="#unified-spec">missing before</a> version 2.1. |
| Also see extension <strong>cl_khr_subgroups</strong>. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>The OpenCL kernel execution model includes collective operations across the |
| work-items within a single sub-group. |
| These are called sub-group functions. |
| We will first discuss the sub-group barrier. |
| Other sub-group functions are discussed afterwards.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The barrier function provides a mechanism for a kernel to synchronize the |
| work-items within a single sub-group: informally, each work-item of the |
| sub-group must execute the barrier before any are allowed to proceed. |
| It also orders memory operations to a specified combination of one or more |
| address spaces such as local memory or global memory, in a similar manner to |
| a fence.</p> |
| </div> |
| <div class="paragraph"> |
| <p>To precisely specify the memory ordering semantics for barrier, we need to |
| distinguish between a dynamic and a static instance of the call to a |
| barrier. |
| A call to a barrier can appear in a loop, for example, and each execution of |
| the same static barrier call results in a new dynamic instance of the |
| barrier that will independently synchronize a sub-groups work-items.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A work-item executing a dynamic instance of a barrier results in two |
| operations, both fences, that are called the entry and exit fences. |
| These fences obey all the rules for fences specified elsewhere in this |
| chapter as well as the following:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The entry fence is a release fence with the same flags and scope as |
| requested for the barrier.</p> |
| </li> |
| <li> |
| <p>The exit fence is an acquire fence with the same flags and scope as |
| requested for the barrier.</p> |
| </li> |
| <li> |
| <p>For each work-item the entry fence is sequenced before the exit fence.</p> |
| </li> |
| <li> |
| <p>If the flags have <code>CLK_GLOBAL_MEM_FENCE</code> set then for each work-item the |
| entry fence global-synchronizes-with the exit fence of all other |
| work-items in the same sub-group.</p> |
| </li> |
| <li> |
| <p>If the flags have <code>CLK_LOCAL_MEM_FENCE</code> set then for each work-item the |
| entry fence local-synchronizes-with the exit fence of all other |
| work-items in the same sub-group.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Other sub-group functions include such functions as scans, reductions, |
| and broadcasts, and are described in the kernel languages and IL specifications. |
| The use of these sub-group functions implies sequenced-before relationships |
| between statements within the execution of a single work-item in order to |
| satisfy data dependencies. |
| For example, a work-item that provides a value to a sub-group function must |
| behave as if it generates that value before beginning execution of that |
| sub-group function. |
| Furthermore, the programmer must ensure that all work-items in a sub-group |
| must execute the same sub-group function call site, or dynamic sub-group |
| function instance.</p> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="_host_side_and_device_side_commands"><a class="anchor" href="#_host_side_and_device_side_commands"></a>3.3.7.5. Host-side and Device-side Commands</h5> |
| <div class="paragraph"> |
| <p>This section describes how the OpenCL API functions associated with |
| command-queues contribute to happens-before relations. |
| There are two types of command queues and associated API functions in OpenCL |
| 2.x; <em>host command-queues</em> and <em>device command-queues</em>. |
| The interaction of these command queues with the memory model are for the |
| most part equivalent. |
| In a few cases, the rules only applies to the host command-queue. |
| We will indicate these special cases by specifically denoting the host |
| command-queue in the memory ordering rule. |
| SVM memory consistency in such instances is implied only with respect to |
| synchronizing host commands.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Memory ordering rules in this section apply to all memory objects (buffers, |
| images and pipes) as well as to SVM allocations where no earlier, and more |
| fine-grained, rules apply.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In the remainder of this section, we assume that each command <strong>C</strong> enqueued |
| onto a command-queue has an associated event object <strong>E</strong> that signals its |
| execution status, regardless of whether <strong>E</strong> was returned to the unit of |
| execution that enqueued <strong>C</strong>. |
| We also distinguish between the API function call that enqueues a command |
| <strong>C</strong> and creates an event <strong>E</strong>, the execution of <strong>C</strong>, and the completion of |
| <strong>C</strong>(which marks the event <strong>E</strong> as complete).</p> |
| </div> |
| <div class="paragraph"> |
| <p>The ordering and synchronization rules for API commands are defined as |
| following:</p> |
| </div> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>If an API function call <strong>X</strong> enqueues a command <strong>C</strong>, then <strong>X</strong> |
| global-synchronizes-with <strong>C</strong>. |
| For example, a host API function to enqueue a kernel |
| global-synchronizes-with the start of that kernel-instances execution, |
| so that memory updates sequenced-before the enqueue kernel function call |
| will global-happen-before any kernel reads or writes to those same |
| memory locations. |
| For a device-side enqueue, global memory updates sequenced before <strong>X</strong> |
| happens-before <strong>C</strong> reads or writes to those memory locations only in the |
| case of fine-grained SVM.</p> |
| </li> |
| <li> |
| <p>If <strong>E</strong> is an event upon which a command <strong>C</strong> waits, then <strong>E</strong> |
| global-synchronizes-with <strong>C</strong>. |
| In particular, if <strong>C</strong> waits on an event <strong>E</strong> that is tracking the |
| execution status of the command <strong>C1</strong>, then memory operations done by |
| <strong>C1</strong> will global-happen-before memory operations done by <strong>C</strong>. |
| As an example, assume we have an OpenCL program using coarse-grain SVM |
| sharing that enqueues a kernel to a host command-queue to manipulate the |
| contents of a region of a buffer that the host thread then accesses |
| after the kernel completes. |
| To do this, the host thread can call <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> to enqueue a |
| blocking-mode map command to map that buffer region, specifying that the |
| map command must wait on an event signaling the kernels completion. |
| When <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> returns, any memory operations performed by |
| the kernel to that buffer region will global- happen-before subsequent |
| memory operations made by the host thread.</p> |
| </li> |
| <li> |
| <p>If a command <strong>C</strong> has an event <strong>E</strong> that signals its completion, then <strong>C</strong> |
| global- synchronizes-with <strong>E</strong>.</p> |
| </li> |
| <li> |
| <p>For a command <strong>C</strong> enqueued to a host-side command queue, if <strong>C</strong> has an |
| event <strong>E</strong> that signals its completion, then <strong>E</strong> global-synchronizes-with |
| an API call <strong>X</strong> that waits on <strong>E</strong>. |
| For example, if a host thread or kernel-instance calls the |
| wait-for-events function on <strong>E</strong> (e.g. the <a href="#clWaitForEvents"><strong>clWaitForEvents</strong></a> function |
| called from a host thread), then <strong>E</strong> global-synchronizes-with that |
| wait-for-events function call.</p> |
| </li> |
| <li> |
| <p>If commands <strong>C</strong> and <strong>C1</strong> are enqueued in that sequence onto an in-order |
| command-queue, then the event (including the event implied between <strong>C</strong> |
| and <strong>C1</strong> due to the in-order queue) signaling <strong>C</strong>'s completion |
| global-synchronizes-with <strong>C1</strong>. |
| Note that in OpenCL 2.x, only a host command-queue can be configured as |
| an in-order queue.</p> |
| </li> |
| <li> |
| <p>If an API call enqueues a marker command <strong>C</strong> with an empty list of |
| events upon which <strong>C</strong> should wait, then the events of all commands |
| enqueued prior to <strong>C</strong> in the command-queue global-synchronize-with <strong>C</strong>.</p> |
| </li> |
| <li> |
| <p>If a host API call enqueues a command-queue barrier command <strong>C</strong> with an |
| empty list of events on which <strong>C</strong> should wait, then the events of all |
| commands enqueued prior to <strong>C</strong> in the command-queue |
| global-synchronize-with <strong>C</strong>. |
| In addition, the event signaling the completion of <strong>C</strong> |
| global-synchronizes-with all commands enqueued after <strong>C</strong> in the |
| command-queue.</p> |
| </li> |
| <li> |
| <p>If a host thread executes a <a href="#clFinish"><strong>clFinish</strong></a> call <strong>X</strong>, then the events of all |
| commands enqueued prior to <strong>X</strong> in the command-queue |
| global-synchronizes-with <strong>X</strong>.</p> |
| </li> |
| <li> |
| <p>The start of a kernel-instance <strong>K</strong> global-synchronizes-with all |
| operations in the work-items of <strong>K</strong>. |
| Note that this includes the execution of any atomic operations by the |
| work-items in a program using fine-grain SVM.</p> |
| </li> |
| <li> |
| <p>All operations of all work-items of a kernel-instance <strong>K</strong> |
| global-synchronizes-with the event signaling the completion of <strong>K</strong>. |
| Note that this also includes the execution of any atomic operations by |
| the work-items in a program using fine-grain SVM.</p> |
| </li> |
| <li> |
| <p>If a callback procedure <strong>P</strong> is registered on an event <strong>E</strong>, then <strong>E</strong> |
| global-synchronizes-with all operations of <strong>P</strong>. |
| Note that callback procedures are only defined for commands within host |
| command-queues.</p> |
| </li> |
| <li> |
| <p>If <strong>C</strong> is a command that waits for an event <strong>E</strong>'s completion, and API |
| function call <strong>X</strong> sets the status of a user event <strong>E</strong>'s status to |
| <a href="#CL_COMPLETE"><code>CL_COMPLETE</code></a> (for example, from a host thread using a |
| <a href="#clSetUserEventStatus"><strong>clSetUserEventStatus</strong></a> function), then <strong>X</strong> global-synchronizes-with <strong>C</strong>.</p> |
| </li> |
| <li> |
| <p>If a device enqueues a command <strong>C</strong> with the |
| <code>CLK_ENQUEUE_FLAGS_WAIT_KERNEL</code> flag, then the end state of the parent |
| kernel instance global-synchronizes with <strong>C</strong>.</p> |
| </li> |
| <li> |
| <p>If a work-group enqueues a command <strong>C</strong> with the |
| <code>CLK_ENQUEUE_FLAGS_WAIT_WORK_GROUP</code> flag, then the end state of the |
| work-group global-synchronizes with <strong>C</strong>.</p> |
| </li> |
| </ol> |
| </div> |
| <div class="paragraph"> |
| <p>When using an out-of-order command queue, a wait on an event or a marker or |
| command-queue barrier command can be used to ensure the correct ordering of |
| dependent commands. |
| In those cases, the wait for the event or the marker or barrier command will |
| provide the necessary global-synchronizes-with relation.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In this situation:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>access to shared locations or disjoint locations in a single <code>cl_mem</code> |
| object when using atomic operations from different kernel instances |
| enqueued from the host such that one or more of the atomic operations is |
| a write is implementation-defined and correct behavior is not guaranteed |
| except at synchronization points.</p> |
| </li> |
| <li> |
| <p>access to shared locations or disjoint locations in a single <code>cl_mem</code> |
| object when using atomic operations from different kernel instances |
| consisting of a parent kernel and any number of child kernels enqueued |
| by that kernel is guaranteed under the memory ordering rules described |
| earlier in this section.</p> |
| </li> |
| <li> |
| <p>access to shared locations or disjoint locations in a single program |
| scope global variable, coarse-grained SVM allocation or fine-grained SVM |
| allocation when using atomic operations from different kernel instances |
| enqueued from the host to a single device is guaranteed under the memory |
| ordering rules described earlier in this section.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If fine-grain SVM is used but without support for the OpenCL 2.x atomic |
| operations, then the host and devices can concurrently read the same memory |
| locations and can concurrently update non-overlapping memory regions, but |
| attempts to update the same memory locations are undefined. |
| Memory consistency is guaranteed at the OpenCL synchronization points |
| without the need for calls to <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> and |
| <a href="#clEnqueueUnmapMemObject"><strong>clEnqueueUnmapMemObject</strong></a>. |
| For fine-grained SVM buffers it is guaranteed that at synchronization points |
| only values written by the kernel will be updated. |
| No writes to fine-grained SVM buffers can be introduced that were not in the |
| original program.</p> |
| </div> |
| <div class="paragraph"> |
| <p>In the remainder of this section, we discuss a few points regarding the |
| ordering rules for commands with a host command queue.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| In an OpenCL 1.x implementation a synchronization point is a |
| kernel-instance or host program location where the contents of memory |
| visible to different work-items or command-queue commands are the same. |
| It also says that waiting on an event and a command-queue barrier are |
| synchronization points between commands in command-queues. |
| Four of the rules listed above (2, 4, 7, and 8) cover these OpenCL |
| synchronization points. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>A map operation (<a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> or <a href="#clEnqueueMapImage"><strong>clEnqueueMapImage</strong></a>) performed on a |
| non-SVM buffer or a coarse-grained SVM buffer is allowed to overwrite the |
| entire target region with the latest runtime view of the data as seen by the |
| command with which the map operation synchronizes, whether the values were |
| written by the executing kernels or not. |
| Any values that were changed within this region by another kernel or host |
| thread while the kernel synchronizing with the map operation was executing |
| may be overwritten by the map operation.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Access to non-SVM <code>cl_mem</code> buffers and coarse-grained SVM allocations is |
| ordered at synchronization points between host commands. |
| In the presence of an out-of-order command queue or a set of command queues |
| mapped to the same device, multiple kernel instances may execute |
| concurrently on the same device.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="opencl-framework"><a class="anchor" href="#opencl-framework"></a>3.4. The OpenCL Framework</h3> |
| <div class="paragraph"> |
| <p>The OpenCL framework allows applications to use a host and one or more |
| OpenCL devices as a single heterogeneous parallel computer system. |
| The framework contains the following components:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><strong>OpenCL Platform layer</strong>: The platform layer allows the host program to |
| discover OpenCL devices and their capabilities and to create contexts.</p> |
| </li> |
| <li> |
| <p><strong>OpenCL Runtime</strong>: The runtime allows the host program to manipulate |
| contexts once they have been created.</p> |
| </li> |
| <li> |
| <p><strong>OpenCL Compiler</strong>: The OpenCL compiler creates program executables that |
| contain OpenCL kernels. |
| The OpenCL compiler may build program executables from OpenCL C source |
| strings, the SPIR-V intermediate language, or device-specific program |
| binary objects, depending on the capabilities of a device. |
| Other kernel languages or intermediate languages may be supported by |
| some implementations.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="sect3"> |
| <h4 id="_mixed_version_support"><a class="anchor" href="#_mixed_version_support"></a>3.4.1. Mixed Version Support</h4> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Mixed version support <a href="#unified-spec">missing before</a> version 1.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL supports devices with different capabilities under a single platform. |
| This includes devices which conform to different versions of the OpenCL |
| specification. |
| There are three version identifiers to consider for an OpenCL system: the |
| platform version, the version of a device, and the version(s) of the kernel |
| language or IL supported on a device.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The platform version indicates the version of the OpenCL runtime that is |
| supported. |
| This includes all of the APIs that the host can use to interact with |
| resources exposed by the OpenCL runtime; including contexts, memory objects, |
| devices, and command queues.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The device version is an indication of the device’s capabilities separate |
| from the runtime and compiler as represented by the device info returned by |
| <a href="#clGetDeviceInfo"><strong>clGetDeviceInfo</strong></a>. |
| Examples of attributes associated with the device version are resource |
| limits (e.g., minimum size of local memory per compute unit) and extended |
| functionality (e.g., list of supported KHR extensions). |
| The version returned corresponds to the highest version of the OpenCL |
| specification for which the device is conformant, but is not higher than the |
| platform version.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The language version for a device represents the OpenCL programming language |
| features a developer can assume are supported on a given device. |
| The version reported is the highest version of the language supported.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_backwards_compatibility"><a class="anchor" href="#_backwards_compatibility"></a>3.4.2. Backwards Compatibility</h4> |
| <div class="paragraph"> |
| <p>Backwards compatibility is an important goal for the OpenCL standard. |
| Backwards compatibility is expected such that a device will consume earlier |
| versions of the OpenCL C programming languages and the SPIR-V intermediate language with the following |
| minimum requirements:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>An OpenCL 1.x device must support at least one 1.x version of the OpenCL C programming language.</p> |
| </li> |
| <li> |
| <p>An OpenCL 2.0 device must support all the requirements of an OpenCL 1.2 device in addition to the OpenCL C 2.0 programming language. |
| If multiple language versions are supported, the compiler defaults to using the OpenCL C 1.2 language version. |
| To utilize the OpenCL 2.0 Kernel programming language, a programmer must specifically pass the appropriate compiler build option (<code>-cl-std=CL2.0</code>). |
| The language version must not be higher than the platform version, but may exceed the <a href="#opencl-c-version">device version</a>.</p> |
| </li> |
| <li> |
| <p>An OpenCL 2.1 device must support all the requirements of an OpenCL 2.0 device in addition to the SPIR-V intermediate language at version 1.0 or above. |
| Intermediate language versioning is encoded as part of the binary object and no flags are required to be passed to the compiler.</p> |
| </li> |
| <li> |
| <p>An OpenCL 2.2 device must support all the requirements of an OpenCL 2.0 device in addition to the SPIR-V intermediate language at version 1.2 or above. |
| Intermediate language versioning is encoded as a part of the binary object and no flags are required to be passed to the compiler.</p> |
| </li> |
| <li> |
| <p>OpenCL 3.0 is designed to enable any OpenCL implementation supporting OpenCL 1.2 or newer to easily support and transition to OpenCL 3.0, by making many features in OpenCL 2.0, 2.1, or 2.2 optional. |
| This means that OpenCL 3.0 is backwards compatible with OpenCL 1.2, but is not necessarily backwards compatible with OpenCL 2.0, 2.1, or 2.2.</p> |
| <div class="paragraph"> |
| <p>An OpenCL 3.0 platform must implement all OpenCL 3.0 APIs, but some APIs may return an error code unconditionally when a feature is not supported by any devices in the platform. |
| Whenever a feature is optional, it will be paired with a query to determine whether the feature is supported. |
| The queries will enable correctly written applications to selectively use all optional features without generating any OpenCL errors, if desired.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL 3.0 also adds a new version of the OpenCL C programming language, which makes many features in OpenCL C 2.0 optional. |
| The new version of OpenCL C is backwards compatible with OpenCL C 1.2, but is not backwards compatible with OpenCL C 2.0. |
| The new version of OpenCL C must be explicitly requested via the <code>-cl-std=</code> build option, otherwise a program will continue to be compiled using the highest OpenCL C 1.x language version supported for the device.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Whenever an OpenCL C feature is optional in the new version of the OpenCL C programming language, it will be paired with a feature macro, such as <code>__opencl_c_feature_name</code>, and a corresponding API query. |
| If a feature macro is defined then the feature is supported by the OpenCL C compiler, otherwise the optional feature is not supported.</p> |
| </div> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>In order to allow future versions of OpenCL to support new types of |
| devices, minor releases of OpenCL may add new profiles where some |
| features that are currently required for all OpenCL devices become |
| optional. |
| All features that are required for an OpenCL profile will also be |
| required for that profile in subsequent minor releases of OpenCL, |
| thereby guaranteeing backwards compatibility for applications |
| targeting specific profiles. |
| It is therefore strongly recommended that applications |
| <a href="#CL_DEVICE_PROFILE">query the profile</a> supported by the OpenCL device |
| they are running on in order to remain robust to future changes.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_versioning"><a class="anchor" href="#_versioning"></a>3.4.3. Versioning</h4> |
| <div class="paragraph"> |
| <p>The OpenCL specification is regularly updated with bug fixes and clarifications. |
| Occasionally new functionality is added to the core and extensions. In order to |
| indicate to developers how and when these changes are made to the specification, |
| and to provide a way to identify each set of changes, the OpenCL API, C language, |
| intermediate languages and extensions maintain a version number. Built-in kernels |
| are also versioned.</p> |
| </div> |
| <div class="sect4"> |
| <h5 id="_versions"><a class="anchor" href="#_versions"></a>3.4.3.1. Versions</h5> |
| <div class="paragraph"> |
| <p>A version number comprises three logical fields:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The <em>major</em> version indicates a significant change. Backwards compatibility may |
| break across major versions.</p> |
| </li> |
| <li> |
| <p>The <em>minor</em> version indicates the addition of new functionality with backwards |
| compatibility for any existing profiles.</p> |
| </li> |
| <li> |
| <p>The <em>patch</em> version indicates bug fixes, clarifications and general improvements.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Version numbers are represented using the <code>cl_version</code> type that is an alias for |
| a 32-bit integer. The fields are packed as follows:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The <em>major</em> version is a 10-bit integer packed into bits 31-22.</p> |
| </li> |
| <li> |
| <p>The <em>minor</em> version is a 10-bit integer packed into bits 21-12.</p> |
| </li> |
| <li> |
| <p>The <em>patch</em> version is a 12-bit integer packed into bits 11-0.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>This enables versions to be ordered using standard C/C++ operators.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A number of convenience macros are provided by the OpenCL Headers to make |
| working with version numbers easier.</p> |
| </div> |
| <div class="paragraph"> |
| <p><code>CL_VERSION_MAJOR</code> extracts the <em>major</em> version from a packed <code>cl_version</code>.<br> |
| <code>CL_VERSION_MINOR</code> extracts the <em>minor</em> version from a packed <code>cl_version</code>.<br> |
| <code>CL_VERSION_PATCH</code> extracts the <em>patch</em> version from a packed <code>cl_version</code>.<br> |
| <code>CL_MAKE_VERSION</code> returns a packed <code>cl_version</code> from a <em>major</em>, <em>minor</em> and |
| <em>patch</em> version.</p> |
| </div> |
| <div class="paragraph"> |
| <p>These are defined as follows:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="keyword">typedef</span> cl_uint cl_version; |
| |
| <span class="preprocessor">#define</span> CL_VERSION_MAJOR_BITS (<span class="integer">10</span>) |
| <span class="preprocessor">#define</span> CL_VERSION_MINOR_BITS (<span class="integer">10</span>) |
| <span class="preprocessor">#define</span> CL_VERSION_PATCH_BITS (<span class="integer">12</span>) |
| |
| <span class="preprocessor">#define</span> CL_VERSION_MAJOR_MASK ((<span class="integer">1</span> << CL_VERSION_MAJOR_BITS) - <span class="integer">1</span>) |
| <span class="preprocessor">#define</span> CL_VERSION_MINOR_MASK ((<span class="integer">1</span> << CL_VERSION_MINOR_BITS) - <span class="integer">1</span>) |
| <span class="preprocessor">#define</span> CL_VERSION_PATCH_MASK ((<span class="integer">1</span> << CL_VERSION_PATCH_BITS) - <span class="integer">1</span>) |
| |
| <span class="preprocessor">#define</span> CL_VERSION_MAJOR(version) \ |
| ((version) >> (CL_VERSION_MINOR_BITS + CL_VERSION_PATCH_BITS)) |
| |
| <span class="preprocessor">#define</span> CL_VERSION_MINOR(version) \ |
| (((version) >> CL_VERSION_PATCH_BITS) & CL_VERSION_MINOR_MASK) |
| |
| <span class="preprocessor">#define</span> CL_VERSION_PATCH(version) ((version) & CL_VERSION_PATCH_MASK) |
| |
| <span class="preprocessor">#define</span> CL_MAKE_VERSION(major, minor, patch) \ |
| ((((major)& CL_VERSION_MAJOR_MASK) << \ |
| (CL_VERSION_MINOR_BITS + CL_VERSION_PATCH_BITS)) | \ |
| (((minor)& CL_VERSION_MINOR_MASK) << \ |
| CL_VERSION_PATCH_BITS) | \ |
| ((patch) & CL_VERSION_PATCH_MASK))</code></pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="_version_name_pairing"><a class="anchor" href="#_version_name_pairing"></a>3.4.3.2. Version name pairing</h5> |
| <div class="paragraph"> |
| <p>It is sometimes necessary to associate a version to an entity it applies to |
| (e.g. extension or built-in kernel). This is done using a dedicated |
| <a href="#cl_name_version"><code>cl_name_<wbr>version</code></a> structure, defined as follows:</p> |
| </div> |
| <div id="cl_name_version" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++"><span class="keyword">typedef</span> <span class="keyword">struct</span> cl_name_version { |
| cl_version version; |
| <span class="predefined-type">char</span> name[CL_NAME_VERSION_MAX_NAME_SIZE]; |
| } cl_name_version;</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The <code>name</code> field is an array of <code>CL_NAME_VERSION_MAX_NAME_SIZE</code> bytes used as |
| storage for a NUL-terminated string whose maximum length is therefore |
| <code>CL_NAME_VERSION_MAX_NAME_SIZE - 1</code>.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="opencl-platform-layer"><a class="anchor" href="#opencl-platform-layer"></a>4. The OpenCL Platform Layer</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This section describes the OpenCL platform layer which implements |
| platform-specific features that allow applications to query OpenCL devices, |
| device configuration information, and to create OpenCL contexts using one or |
| more devices.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_querying_platform_info"><a class="anchor" href="#_querying_platform_info"></a>4.1. Querying Platform Info</h3> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The list of platforms available can be obtained with the function:</p> |
| </div> |
| <div id="clGetPlatformIDs" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetPlatformIDs( |
| cl_uint num_entries, |
| cl_platform_id* platforms, |
| cl_uint* num_platforms);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>num_entries</em> is the number of <code>cl_platform_<wbr>id</code> entries that can be added to |
| <em>platforms</em>. |
| If <em>platforms</em> is not <code>NULL</code>, the <em>num_entries</em> must be greater than zero.</p> |
| </li> |
| <li> |
| <p><em>platforms</em> returns a list of OpenCL platforms found. |
| The <code>cl_platform_<wbr>id</code> values returned in <em>platforms</em> can be used to identify a |
| specific OpenCL platform. |
| If <em>platforms</em> is <code>NULL</code>, this argument is ignored. |
| The number of OpenCL platforms returned is the minimum of the value |
| specified by <em>num_entries</em> or the number of OpenCL platforms available.</p> |
| </li> |
| <li> |
| <p><em>num_platforms</em> returns the number of OpenCL platforms available. |
| If <em>num_platforms</em> is <code>NULL</code>, this argument is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetPlatformIDs"><strong>clGetPlatformIDs</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>num_entries</em> is equal to zero and <em>platforms</em> is |
| not <code>NULL</code> or if both <em>num_platforms</em> and <em>platforms</em> are <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>Specific information about an OpenCL platform can be obtained with |
| the function:</p> |
| </div> |
| <div id="clGetPlatformInfo" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetPlatformInfo( |
| cl_platform_id platform, |
| cl_platform_info param_name, |
| size_t param_value_size, |
| <span class="directive">void</span>* param_value, |
| size_t* param_value_size_ret);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>platform</em> refers to the platform ID returned by <a href="#clGetPlatformIDs"><strong>clGetPlatformIDs</strong></a> or can |
| be <code>NULL</code>. |
| If <em>platform</em> is <code>NULL</code>, the behavior is implementation-defined.</p> |
| </li> |
| <li> |
| <p><em>param_name</em> is an enumeration constant that identifies the platform |
| information being queried. |
| It can be one of the following values as specified in the |
| <a href="#platform-queries-table">Platform Queries</a> table.</p> |
| </li> |
| <li> |
| <p><em>param_value</em> is a pointer to memory location where appropriate values for a |
| given <em>param_name</em>, as specified in the <a href="#platform-queries-table">Platform |
| Queries</a> table, will be returned. |
| If <em>param_value</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| <li> |
| <p><em>param_value_size</em> specifies the size in bytes of memory pointed to by |
| <em>param_value</em>. |
| This size in bytes must be ≥ size of return type specified in the |
| <a href="#platform-queries-table">Platform Queries</a> table.</p> |
| </li> |
| <li> |
| <p><em>param_value_size_ret</em> returns the actual size in bytes of data being |
| queried by <em>param_name</em>. |
| If <em>param_value_size_ret</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The information that can be queried using <a href="#clGetPlatformInfo"><strong>clGetPlatformInfo</strong></a> is specified |
| in the <a href="#platform-queries-table">Platform Queries</a> table.</p> |
| </div> |
| <table id="platform-queries-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 3. List of supported param_names by <a href="#clGetPlatformInfo">clGetPlatformInfo</a></caption> |
| <colgroup> |
| <col style="width: 33%;"> |
| <col style="width: 17%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Platform Info</th> |
| <th class="tableblock halign-left valign-top">Return Type</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_PROFILE"></a><a href="#CL_PLATFORM_PROFILE"><code>CL_PLATFORM_<wbr>PROFILE</code></a> <sup class="footnote">[<a id="_footnoteref_2" class="footnote" href="#_footnotedef_2" title="View footnote.">2</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[] <sup class="footnote">[<a id="_footnoteref_3" class="footnote" href="#_footnotedef_3" title="View footnote.">3</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL profile string. |
| Returns the profile name supported by the implementation. |
| The profile name returned can be one of the following strings:</p> |
| <p class="tableblock"> FULL_PROFILE - if the implementation supports the OpenCL |
| specification (functionality defined as part of the core |
| specification and does not require any extensions to be supported).</p> |
| <p class="tableblock"> EMBEDDED_PROFILE - if the implementation supports the OpenCL |
| embedded profile. |
| The embedded profile is defined to be a subset for each version of |
| OpenCL. |
| The embedded profile for OpenCL is described in |
| <a href="#opencl-embedded-profile">OpenCL Embedded Profile</a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_VERSION"></a><a href="#CL_PLATFORM_VERSION"><code>CL_PLATFORM_<wbr>VERSION</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL version string. |
| Returns the OpenCL version supported by the implementation. |
| This version string has the following format:</p> |
| <p class="tableblock"> <em>OpenCL<space><major_version.minor_version><space><platform-specific |
| information></em></p> |
| <p class="tableblock"> The <em>major_version.minor_version</em> value returned will be one of 1.0, |
| 1.1, 1.2, 2.0, 2.1, 2.2 or 3.0.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_NUMERIC_VERSION"></a><a href="#CL_PLATFORM_NUMERIC_VERSION"><code>CL_PLATFORM_<wbr>NUMERIC_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_version</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the detailed (major, minor, patch) version supported by the |
| platform. The major and minor version numbers returned must match |
| those returned via <a href="#CL_PLATFORM_VERSION"><code>CL_PLATFORM_<wbr>VERSION</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_NAME"></a><a href="#CL_PLATFORM_NAME"><code>CL_PLATFORM_<wbr>NAME</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Platform name string.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_VENDOR"></a><a href="#CL_PLATFORM_VENDOR"><code>CL_PLATFORM_<wbr>VENDOR</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Platform vendor string.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_EXTENSIONS"></a><a href="#CL_PLATFORM_EXTENSIONS"><code>CL_PLATFORM_<wbr>EXTENSIONS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns a space separated list of extension names (the extension |
| names themselves do not contain any spaces) supported by the |
| platform. |
| Each extension that is supported by all devices associated with this |
| platform must be reported here.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_EXTENSIONS_WITH_VERSION"></a><a href="#CL_PLATFORM_EXTENSIONS_WITH_VERSION"><code>CL_PLATFORM_<wbr>EXTENSIONS_<wbr>WITH_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#cl_name_version"><code>cl_name_<wbr>version</code></a>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns an array of description (name and version) structures that lists |
| all the extensions supported by the platform. The same extension name |
| must not be reported more than once. The list of extensions reported |
| must match the list reported via <a href="#CL_PLATFORM_EXTENSIONS"><code>CL_PLATFORM_<wbr>EXTENSIONS</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_PLATFORM_HOST_TIMER_RESOLUTION"></a><a href="#CL_PLATFORM_HOST_TIMER_RESOLUTION"><code>CL_PLATFORM_<wbr>HOST_<wbr>TIMER_<wbr>RESOLUTION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_ulong</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the resolution of the host timer in nanoseconds as used by |
| <a href="#clGetDeviceAndHostTimer"><strong>clGetDeviceAndHostTimer</strong></a>.</p> |
| <p class="tableblock"> Support for device and host timer synchronization is required for |
| platforms supporting OpenCL 2.1 or 2.2. |
| This value must be 0 for devices that do not support device and |
| host timer synchronization.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><a href="#clGetPlatformInfo"><strong>clGetPlatformInfo</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following |
| errors <sup class="footnote">[<a id="_footnoteref_4" class="footnote" href="#_footnotedef_4" title="View footnote.">4</a>]</sup>.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_PLATFORM"><code>CL_INVALID_<wbr>PLATFORM</code></a> if <em>platform</em> is not a valid platform.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>param_name</em> is not one of the supported values or |
| if size in bytes specified by <em>param_value_size</em> is < size of return |
| type as specified in the <a href="#platform-queries-table">OpenCL Platform |
| Queries</a> table, and <em>param_value</em> is not a <code>NULL</code> value.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="platform-querying-devices"><a class="anchor" href="#platform-querying-devices"></a>4.2. Querying Devices</h3> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The list of devices available on a platform can be obtained using the |
| function <sup class="footnote">[<a id="_footnoteref_5" class="footnote" href="#_footnotedef_5" title="View footnote.">5</a>]</sup>:</p> |
| </div> |
| <div id="clGetDeviceIDs" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetDeviceIDs( |
| cl_platform_id platform, |
| cl_device_type device_type, |
| cl_uint num_entries, |
| cl_device_id* devices, |
| cl_uint* num_devices);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>platform</em> refers to the platform ID returned by <a href="#clGetPlatformIDs"><strong>clGetPlatformIDs</strong></a> or can |
| be <code>NULL</code>. |
| If <em>platform</em> is <code>NULL</code>, the behavior is implementation-defined.</p> |
| </li> |
| <li> |
| <p><em>device_type</em> is a bitfield that identifies the type of OpenCL device. |
| The <em>device_type</em> can be used to query specific OpenCL devices or all OpenCL |
| devices available. |
| The valid values for <em>device_type</em> are specified in the |
| <a href="#device-types-table">Device Types</a> table.</p> |
| </li> |
| <li> |
| <p><em>num_entries</em> is the number of <code>cl_device_<wbr>id</code> entries that can be added to |
| <em>devices</em>. |
| If <em>devices</em> is not <code>NULL</code>, the <em>num_entries</em> must be greater than zero.</p> |
| </li> |
| <li> |
| <p><em>devices</em> returns a list of OpenCL devices found. |
| The <code>cl_device_<wbr>id</code> values returned in <em>devices</em> can be used to identify a |
| specific OpenCL device. |
| If <em>devices</em> is <code>NULL</code>, this argument is ignored. |
| The number of OpenCL devices returned is the minimum of the value specified |
| by <em>num_entries</em> or the number of OpenCL devices whose type matches |
| <em>device_type</em>.</p> |
| </li> |
| <li> |
| <p><em>num_devices</em> returns the number of OpenCL devices available that match |
| <em>device_type</em>. |
| If <em>num_devices</em> is <code>NULL</code>, this argument is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="device-types-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 4. List of supported device_types by <a href="#clGetDeviceIDs">clGetDeviceIDs</a></caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Device Type</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_TYPE_CPU"></a><a href="#CL_DEVICE_TYPE_CPU"><code>CL_DEVICE_<wbr>TYPE_<wbr>CPU</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">An OpenCL device similar to a traditional CPU (Central Processing Unit). |
| The host processor that executes OpenCL host code may also be considered |
| a CPU OpenCL device.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_TYPE_GPU"></a><a href="#CL_DEVICE_TYPE_GPU"><code>CL_DEVICE_<wbr>TYPE_<wbr>GPU</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">An OpenCL device similar to a GPU (Graphics Processing Unit). |
| Many systems include a dedicated processor for graphics or rendering |
| that may be considered a GPU OpenCL device.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_TYPE_ACCELERATOR"></a><a href="#CL_DEVICE_TYPE_ACCELERATOR"><code>CL_DEVICE_<wbr>TYPE_<wbr>ACCELERATOR</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Dedicated devices that may accelerate OpenCL programs, such as FPGAs |
| (Field Programmable Gate Arrays), DSPs (Digital Signal Processors), or |
| AI (Artificial Intelligence) processors.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_TYPE_CUSTOM"></a><a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Specialized devices that implement some of the OpenCL runtime APIs but |
| do not support all required OpenCL functionality.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_TYPE_DEFAULT"></a><a href="#CL_DEVICE_TYPE_DEFAULT"><code>CL_DEVICE_<wbr>TYPE_<wbr>DEFAULT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The default OpenCL device in the platform. |
| The default OpenCL device must not be a <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a> device.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_TYPE_ALL"></a><a href="#CL_DEVICE_TYPE_ALL"><code>CL_DEVICE_<wbr>TYPE_<wbr>ALL</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">All OpenCL devices available in the platform, except for |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a> devices.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>The device type is purely informational and has no semantic meaning.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Some devices may be more than one type. |
| For example, a <a href="#CL_DEVICE_TYPE_CPU"><code>CL_DEVICE_<wbr>TYPE_<wbr>CPU</code></a> device may also be a |
| <a href="#CL_DEVICE_TYPE_GPU"><code>CL_DEVICE_<wbr>TYPE_<wbr>GPU</code></a> device, or a <a href="#CL_DEVICE_TYPE_ACCELERATOR"><code>CL_DEVICE_<wbr>TYPE_<wbr>ACCELERATOR</code></a> device |
| may also be some other, more descriptive device type. |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a> devices must not be combined with any other |
| device types.</p> |
| </div> |
| <div class="paragraph"> |
| <p>One device in the platform should be a <a href="#CL_DEVICE_TYPE_DEFAULT"><code>CL_DEVICE_<wbr>TYPE_<wbr>DEFAULT</code></a> device. |
| The default device should also be a more specific device type, such |
| as <a href="#CL_DEVICE_TYPE_CPU"><code>CL_DEVICE_<wbr>TYPE_<wbr>CPU</code></a> or <a href="#CL_DEVICE_TYPE_GPU"><code>CL_DEVICE_<wbr>TYPE_<wbr>GPU</code></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_PLATFORM"><code>CL_INVALID_<wbr>PLATFORM</code></a> if <em>platform</em> is not a valid platform.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE_TYPE"><code>CL_INVALID_<wbr>DEVICE_<wbr>TYPE</code></a> if <em>device_type</em> is not a valid value.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>num_entries</em> is equal to zero and <em>devices</em> is not |
| <code>NULL</code> or if both <em>num_devices</em> and <em>devices</em> are <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_NOT_FOUND"><code>CL_DEVICE_<wbr>NOT_<wbr>FOUND</code></a> if no OpenCL devices that matched <em>device_type</em> were |
| found.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The application can query specific capabilities of the OpenCL device(s) |
| returned by <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a>. |
| This can be used by the application to determine which device(s) to use.</p> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To get specific information about an OpenCL device, call the function:</p> |
| </div> |
| <div id="clGetDeviceInfo" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetDeviceInfo( |
| cl_device_id device, |
| cl_device_info param_name, |
| size_t param_value_size, |
| <span class="directive">void</span>* param_value, |
| size_t* param_value_size_ret);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>device</em> may be a device returned by <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a> or a sub-device |
| created by <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a>. |
| If <em>device</em> is a sub-device, the specific information for the sub-device |
| will be returned. |
| The information that can be queried using <a href="#clGetDeviceInfo"><strong>clGetDeviceInfo</strong></a> is specified in |
| the <a href="#device-queries-table">Device Queries</a> table.</p> |
| </li> |
| <li> |
| <p><em>param_name</em> is an enumeration constant that identifies the device |
| information being queried. |
| It can be one of the following values as specified in the |
| <a href="#device-queries-table">Device Queries</a> table.</p> |
| </li> |
| <li> |
| <p><em>param_value</em> is a pointer to memory location where appropriate values for a |
| given <em>param_name</em>, as specified in the <a href="#device-queries-table">Device |
| Queries</a> table, will be returned. |
| If <em>param_value</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| <li> |
| <p><em>param_value_size</em> specifies the size in bytes of memory pointed to by |
| <em>param_value</em>. |
| This size in bytes must be ≥ size of return type specified in the |
| <a href="#device-queries-table">Device Queries</a> table.</p> |
| </li> |
| <li> |
| <p><em>param_value_size_ret</em> returns the actual size in bytes of data being |
| queried by <em>param_name</em>. |
| If <em>param_value_size_ret</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The device queries described in the <a href="#device-queries-table">Device Queries</a> |
| table should return the same information for a root-level device i.e. a |
| device returned by <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a> and any sub-devices created from this |
| device except for the following queries:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_DEVICE_GLOBAL_MEM_CACHE_SIZE"><code>CL_DEVICE_<wbr>GLOBAL_<wbr>MEM_<wbr>CACHE_<wbr>SIZE</code></a></p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_BUILT_IN_KERNELS"><code>CL_DEVICE_<wbr>BUILT_<wbr>IN_<wbr>KERNELS</code></a></p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_PARENT_DEVICE"><code>CL_DEVICE_<wbr>PARENT_<wbr>DEVICE</code></a></p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_PARTITION_TYPE"><code>CL_DEVICE_<wbr>PARTITION_<wbr>TYPE</code></a></p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_REFERENCE_COUNT"><code>CL_DEVICE_<wbr>REFERENCE_<wbr>COUNT</code></a></p> |
| </li> |
| </ul> |
| </div> |
| <table id="device-queries-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 5. List of supported param_names by <a href="#clGetDeviceInfo">clGetDeviceInfo</a></caption> |
| <colgroup> |
| <col style="width: 33%;"> |
| <col style="width: 17%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Device Info</th> |
| <th class="tableblock halign-left valign-top">Return Type</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_TYPE"></a><a href="#CL_DEVICE_TYPE"><code>CL_DEVICE_<wbr>TYPE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>type</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The type or types of the OpenCL device.</p> |
| <p class="tableblock"> Please see the <a href="#device-types-table">Device Types</a> table |
| for supported device types and device type combinations.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_VENDOR_ID"></a><a href="#CL_DEVICE_VENDOR_ID"><code>CL_DEVICE_<wbr>VENDOR_<wbr>ID</code></a> <sup class="footnote">[<a id="_footnoteref_6" class="footnote" href="#_footnotedef_6" title="View footnote.">6</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A unique device vendor identifier.</p> |
| <p class="tableblock"> If the vendor has a PCI vendor ID, the low 16 bits must contain that PCI |
| vendor ID, and the remaining bits must be set to zero. Otherwise, the |
| value returned must be a valid Khronos vendor ID represented by type |
| <code>cl_khronos_<wbr>vendor_<wbr>id</code>. Khronos vendor IDs are allocated starting at |
| 0x10000, to distinguish them from the PCI vendor ID namespace.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_COMPUTE_UNITS"></a><a href="#CL_DEVICE_MAX_COMPUTE_UNITS"><code>CL_DEVICE_<wbr>MAX_<wbr>COMPUTE_<wbr>UNITS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The number of parallel compute units on the OpenCL device. |
| A work-group executes on a single compute unit. |
| The minimum value is 1.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS"></a><a href="#CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS"><code>CL_DEVICE_<wbr>MAX_<wbr>WORK_<wbr>ITEM_<wbr>DIMENSIONS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Maximum dimensions that specify the global and local work-item IDs |
| used by the data parallel execution model. (Refer to |
| <a href="#clEnqueueNDRangeKernel"><strong>clEnqueueNDRangeKernel</strong></a>). |
| The minimum value is 3 for devices that are not of type |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_WORK_ITEM_SIZES"></a><a href="#CL_DEVICE_MAX_WORK_ITEM_SIZES"><code>CL_DEVICE_<wbr>MAX_<wbr>WORK_<wbr>ITEM_<wbr>SIZES</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Maximum number of work-items that can be specified in each dimension |
| of the work-group to <a href="#clEnqueueNDRangeKernel"><strong>clEnqueueNDRangeKernel</strong></a>.</p> |
| <p class="tableblock"> Returns <em>n</em> <code>size_t</code> entries, where <em>n</em> is the value returned by the |
| query for <a href="#CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS"><code>CL_DEVICE_<wbr>MAX_<wbr>WORK_<wbr>ITEM_<wbr>DIMENSIONS</code></a>.</p> |
| <p class="tableblock"> The minimum value is (1, 1, 1) for devices that are not of type |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_WORK_GROUP_SIZE"></a><a href="#CL_DEVICE_MAX_WORK_GROUP_SIZE"><code>CL_DEVICE_<wbr>MAX_<wbr>WORK_<wbr>GROUP_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Maximum number of work-items in a work-group that a device is |
| capable of executing on a single compute unit, for any given |
| kernel-instance running on the device. (Refer also to |
| <a href="#clEnqueueNDRangeKernel"><strong>clEnqueueNDRangeKernel</strong></a> and <a href="#CL_KERNEL_WORK_GROUP_SIZE"><code>CL_KERNEL_<wbr>WORK_<wbr>GROUP_<wbr>SIZE</code></a> ). |
| The minimum value is 1. |
| The returned value is an upper limit and will not necessarily |
| maximize performance. |
| This maximum may be larger than supported by a specific kernel |
| (refer to the <a href="#CL_KERNEL_WORK_GROUP_SIZE"><code>CL_KERNEL_<wbr>WORK_<wbr>GROUP_<wbr>SIZE</code></a> query of <a href="#clGetKernelWorkGroupInfo"><strong>clGetKernelWorkGroupInfo</strong></a>).</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR"></a><a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>CHAR</code></a> <br> |
| <a id="CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT"></a><a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>SHORT</code></a> <br> |
| <a id="CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT"></a><a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>INT</code></a> <br> |
| <a id="CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG"></a><a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>LONG</code></a> <br> |
| <a id="CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT"></a><a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>FLOAT</code></a> <br> |
| <a id="CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE"></a><a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>DOUBLE</code></a><br> |
| <a id="CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF"></a><a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>HALF</code></a></p> |
| <p class="tableblock"> <a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>HALF</code></a> is <a href="#unified-spec">missing before</a> |
| version 1.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Preferred native vector width size for built-in scalar types that |
| can be put into vectors. |
| The vector width is defined as the number of scalar elements that |
| can be stored in the vector.</p> |
| <p class="tableblock"> If double precision is not supported, |
| <a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>DOUBLE</code></a> must return 0.</p> |
| <p class="tableblock"> If the <strong>cl_khr_fp16</strong> extension is not supported, |
| <a href="#CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>VECTOR_<wbr>WIDTH_<wbr>HALF</code></a> must return 0.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR"></a><a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>CHAR</code></a> <br> |
| <a id="CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT"></a><a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>SHORT</code></a> <br> |
| <a id="CL_DEVICE_NATIVE_VECTOR_WIDTH_INT"></a><a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_INT"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>INT</code></a> <br> |
| <a id="CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG"></a><a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>LONG</code></a> <br> |
| <a id="CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT"></a><a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>FLOAT</code></a> <br> |
| <a id="CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE"></a><a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>DOUBLE</code></a><br> |
| <a id="CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF"></a><a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>HALF</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the native ISA vector width. |
| The vector width is defined as the number of scalar elements that |
| can be stored in the vector.</p> |
| <p class="tableblock"> If double precision is not supported, |
| <a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>DOUBLE</code></a> must return 0.</p> |
| <p class="tableblock"> If the <strong>cl_khr_fp16</strong> extension is not supported, |
| <a href="#CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF"><code>CL_DEVICE_<wbr>NATIVE_<wbr>VECTOR_<wbr>WIDTH_<wbr>HALF</code></a> must return 0.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_CLOCK_FREQUENCY"></a><a href="#CL_DEVICE_MAX_CLOCK_FREQUENCY"><code>CL_DEVICE_<wbr>MAX_<wbr>CLOCK_<wbr>FREQUENCY</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Clock frequency of the device in MHz. |
| The meaning of this value is implementation-defined. |
| For devices with multiple clock domains, the clock frequency for any |
| of the clock domains may be returned. |
| For devices that dynamically change frequency for power or thermal |
| reasons, the returned clock frequency may be any valid frequency. |
| Note: This definition is <a href="#unified-spec">missing before</a> version 2.2.</p> |
| <p class="tableblock"> Maximum configured clock frequency of the device in MHz. |
| Note: This definition is <a href="#unified-spec">deprecated by</a> version 2.2.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_ADDRESS_BITS"></a><a href="#CL_DEVICE_ADDRESS_BITS"><code>CL_DEVICE_<wbr>ADDRESS_<wbr>BITS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The default compute device address space size of the global address |
| space specified as an unsigned integer value in bits. |
| Currently supported values are 32 or 64 bits.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_MEM_ALLOC_SIZE"></a><a href="#CL_DEVICE_MAX_MEM_ALLOC_SIZE"><code>CL_DEVICE_<wbr>MAX_<wbr>MEM_<wbr>ALLOC_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_ulong</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max size of memory object allocation in bytes. |
| The minimum value is max(min(1024 × 1024 × 1024, 1/4<sup>th</sup> |
| of <a href="#CL_DEVICE_GLOBAL_MEM_SIZE"><code>CL_DEVICE_<wbr>GLOBAL_<wbr>MEM_<wbr>SIZE</code></a>), 32 × 1024 × 1024) for |
| devices that are not of type <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE_SUPPORT"></a><a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if images are supported by the OpenCL device and <a href="#CL_FALSE"><code>CL_FALSE</code></a> |
| otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_READ_IMAGE_ARGS"></a><a href="#CL_DEVICE_MAX_READ_IMAGE_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>READ_<wbr>IMAGE_<wbr>ARGS</code></a> <sup class="footnote">[<a id="_footnoteref_7" class="footnote" href="#_footnotedef_7" title="View footnote.">7</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max number of image objects arguments of a kernel declared with the |
| read_only qualifier. |
| The minimum value is 128 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, the |
| value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_WRITE_IMAGE_ARGS"></a><a href="#CL_DEVICE_MAX_WRITE_IMAGE_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>WRITE_<wbr>IMAGE_<wbr>ARGS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max number of image objects arguments of a kernel declared with the |
| write_only qualifier. |
| The minimum value is 64 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, the |
| value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS"></a><a href="#CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>READ_<wbr>WRITE_<wbr>IMAGE_<wbr>ARGS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max number of image objects arguments of a kernel declared with the |
| write_only or read_write qualifier.</p> |
| <p class="tableblock"> Support for read-write image arguments is required for an OpenCL 2.0, 2.1, |
| or 2.2 device if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>.</p> |
| <p class="tableblock"> The minimum value is 64 if the device supports read-write images arguments, |
| and must be 0 for devices that do not support read-write images.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IL_VERSION"></a><a href="#CL_DEVICE_IL_VERSION"><code>CL_DEVICE_<wbr>IL_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.1. |
| Also see extension <strong>cl_khr_il_program</strong>.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The intermediate languages that can be supported by |
| <a href="#clCreateProgramWithIL"><strong>clCreateProgramWithIL</strong></a> for this device. |
| Returns a space-separated list of IL version strings of the form |
| <IL_Prefix>_<Major_Version>.<Minor_Version>.</p> |
| <p class="tableblock"> For an OpenCL 2.1 or 2.2 device, SPIR-V is a required IL prefix.</p> |
| <p class="tableblock"> If the device does not support intermediate language programs, the |
| value must be <code>""</code> (an empty string).</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_ILS_WITH_VERSION"></a><a href="#CL_DEVICE_ILS_WITH_VERSION"><code>CL_DEVICE_<wbr>ILS_<wbr>WITH_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0. |
| Also see extension <strong>cl_khr_il_program</strong>.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#cl_name_version"><code>cl_name_<wbr>version</code></a>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns an array of descriptions (name and version) for all supported |
| intermediate languages. Intermediate languages with the same name may be |
| reported more than once but each name and major/minor version |
| combination may only be reported once. The list of intermediate |
| languages reported must match the list reported via |
| <a href="#CL_DEVICE_IL_VERSION"><code>CL_DEVICE_<wbr>IL_<wbr>VERSION</code></a>.</p> |
| <p class="tableblock"> For an OpenCL 2.1 or 2.2 device, at least one version of SPIR-V must |
| be reported.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE2D_MAX_WIDTH"></a><a href="#CL_DEVICE_IMAGE2D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>WIDTH</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max width of 2D image or 1D image not created from a buffer object |
| in pixels.</p> |
| <p class="tableblock"> The minimum value is 16384 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE2D_MAX_HEIGHT"></a><a href="#CL_DEVICE_IMAGE2D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>HEIGHT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max height of 2D image in pixels.</p> |
| <p class="tableblock"> The minimum value is 16384 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE3D_MAX_WIDTH"></a><a href="#CL_DEVICE_IMAGE3D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>WIDTH</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max width of 3D image in pixels.</p> |
| <p class="tableblock"> The minimum value is 2048 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE3D_MAX_HEIGHT"></a><a href="#CL_DEVICE_IMAGE3D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>HEIGHT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max height of 3D image in pixels.</p> |
| <p class="tableblock"> The minimum value is 2048 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE3D_MAX_DEPTH"></a><a href="#CL_DEVICE_IMAGE3D_MAX_DEPTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>DEPTH</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max depth of 3D image in pixels.</p> |
| <p class="tableblock"> The minimum value is 2048 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE_MAX_BUFFER_SIZE"></a><a href="#CL_DEVICE_IMAGE_MAX_BUFFER_SIZE"><code>CL_DEVICE_<wbr>IMAGE_<wbr>MAX_<wbr>BUFFER_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max number of pixels for a 1D image created from a buffer object.</p> |
| <p class="tableblock"> The minimum value is 65536 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE_MAX_ARRAY_SIZE"></a><a href="#CL_DEVICE_IMAGE_MAX_ARRAY_SIZE"><code>CL_DEVICE_<wbr>IMAGE_<wbr>MAX_<wbr>ARRAY_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max number of images in a 1D or 2D image array.</p> |
| <p class="tableblock"> The minimum value is 2048 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_SAMPLERS"></a><a href="#CL_DEVICE_MAX_SAMPLERS"><code>CL_DEVICE_<wbr>MAX_<wbr>SAMPLERS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Maximum number of samplers that can be used in a kernel.</p> |
| <p class="tableblock"> The minimum value is 16 if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, |
| the value is 0 otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE_PITCH_ALIGNMENT"></a><a href="#CL_DEVICE_IMAGE_PITCH_ALIGNMENT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>PITCH_<wbr>ALIGNMENT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The row pitch alignment size in pixels for 2D images created from a |
| buffer. |
| The value returned must be a power of 2.</p> |
| <p class="tableblock"> Support for 2D images created from a buffer is required for an OpenCL 2.0, 2.1, |
| or 2.2 device if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>.</p> |
| <p class="tableblock"> This value must be 0 for devices that do not support 2D images created from a buffer.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT"></a><a href="#CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>BASE_<wbr>ADDRESS_<wbr>ALIGNMENT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This query specifies the minimum alignment in pixels of the host_ptr |
| specified to <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> or <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> when a 2D image |
| is created from a buffer which was created using <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>. |
| The value returned must be a power of 2.</p> |
| <p class="tableblock"> Support for 2D images created from a buffer is required for an OpenCL 2.0, 2.1, |
| or 2.2 device if <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>.</p> |
| <p class="tableblock"> This value must be 0 for devices that do not support 2D images created from a buffer.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_PIPE_ARGS"></a><a href="#CL_DEVICE_MAX_PIPE_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>PIPE_<wbr>ARGS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of pipe objects that can be passed as arguments |
| to a kernel. |
| The minimum value is 16 for devices supporting pipes, and must be |
| 0 for devices that do not support pipes.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS"></a><a href="#CL_DEVICE_PIPE_MAX_ACTIVE_RESERVATIONS"><code>CL_DEVICE_<wbr>PIPE_<wbr>MAX_<wbr>ACTIVE_<wbr>RESERVATIONS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of reservations that can be active for a pipe per |
| work-item in a kernel. |
| A work-group reservation is counted as one reservation per |
| work-item. |
| The minimum value is 1 for devices supporting pipes, and must be |
| 0 for devices that do not support pipes.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PIPE_MAX_PACKET_SIZE"></a><a href="#CL_DEVICE_PIPE_MAX_PACKET_SIZE"><code>CL_DEVICE_<wbr>PIPE_<wbr>MAX_<wbr>PACKET_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The maximum size of pipe packet in bytes.</p> |
| <p class="tableblock"> Support for pipes is required for an OpenCL 2.0, 2.1, or 2.2 device. |
| The minimum value is 1024 bytes if the device supports pipes, and must be |
| 0 for devices that do not support pipes.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_PARAMETER_SIZE"></a><a href="#CL_DEVICE_MAX_PARAMETER_SIZE"><code>CL_DEVICE_<wbr>MAX_<wbr>PARAMETER_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max size in bytes of all arguments that can be passed to a kernel.</p> |
| <p class="tableblock"> The minimum value is 1024 for devices that are not of type |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>. |
| For this minimum value, only a maximum of 128 arguments can be |
| passed to a kernel</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MEM_BASE_ADDR_ALIGN"></a><a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Alignment requirement (in bits) for sub-buffer offsets. |
| The minimum value is the size (in bits) of the largest OpenCL |
| built-in data type supported by the device (long16 in FULL profile, |
| long16 or int16 in EMBEDDED profile) for devices that are not of |
| type <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE"></a><a href="#CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE"><code>CL_DEVICE_<wbr>MIN_<wbr>DATA_<wbr>TYPE_<wbr>ALIGN_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Deprecated by</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The minimum value is the size (in bytes) of the largest OpenCL data |
| type supported by the device (<code>long16</code> in FULL profile, <code>long16</code> or |
| <code>int16</code> in EMBEDDED profile).</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_SINGLE_FP_CONFIG"></a><a href="#CL_DEVICE_SINGLE_FP_CONFIG"><code>CL_DEVICE_<wbr>SINGLE_<wbr>FP_<wbr>CONFIG</code></a> <sup class="footnote" id="_footnote_native-rounding-modes">[<a id="_footnoteref_8" class="footnote" href="#_footnotedef_8" title="View footnote.">8</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>fp_<wbr>config</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes single precision floating-point capability of the device. |
| This is a bit-field that describes one or more of the following |
| values:</p> |
| <p class="tableblock"> <a id="CL_FP_DENORM"></a><a href="#CL_FP_DENORM"><code>CL_FP_<wbr>DENORM</code></a> - denorms are supported<br> |
| <a id="CL_FP_INF_NAN"></a><a href="#CL_FP_INF_NAN"><code>CL_FP_<wbr>INF_<wbr>NAN</code></a> - INF and quiet NaNs are supported<br> |
| <a id="CL_FP_ROUND_TO_NEAREST"></a><a href="#CL_FP_ROUND_TO_NEAREST"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>NEAREST</code></a>-- round to nearest even rounding mode |
| supported<br> |
| <a id="CL_FP_ROUND_TO_ZERO"></a><a href="#CL_FP_ROUND_TO_ZERO"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>ZERO</code></a> - round to zero rounding mode supported<br> |
| <a id="CL_FP_ROUND_TO_INF"></a><a href="#CL_FP_ROUND_TO_INF"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>INF</code></a> - round to positive and negative infinity |
| rounding modes supported<br> |
| <a id="CL_FP_FMA"></a><a href="#CL_FP_FMA"><code>CL_FP_<wbr>FMA</code></a> - IEEE754-2008 fused multiply-add is supported<br> |
| <a id="CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT"></a><a href="#CL_FP_CORRECTLY_ROUNDED_DIVIDE_SQRT"><code>CL_FP_<wbr>CORRECTLY_<wbr>ROUNDED_<wbr>DIVIDE_<wbr>SQRT</code></a> - divide and sqrt are correctly |
| rounded as defined by the IEEE754 specification<br> |
| <a id="CL_FP_SOFT_FLOAT"></a><a href="#CL_FP_SOFT_FLOAT"><code>CL_FP_<wbr>SOFT_<wbr>FLOAT</code></a> - Basic floating-point operations (such as |
| addition, subtraction, multiplication) are implemented in software</p> |
| <p class="tableblock"> For the full profile, the mandated minimum floating-point capability |
| for devices that are not of type <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a> is:</p> |
| <p class="tableblock"> <a href="#CL_FP_ROUND_TO_NEAREST"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>NEAREST</code></a> |<br> |
| <a href="#CL_FP_INF_NAN"><code>CL_FP_<wbr>INF_<wbr>NAN</code></a>.</p> |
| <p class="tableblock"> For the embedded profile, see the |
| <a href="#embedded-profile-single-fp-config-requirements">dedicated table</a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_DOUBLE_FP_CONFIG"></a><a href="#CL_DEVICE_DOUBLE_FP_CONFIG"><code>CL_DEVICE_<wbr>DOUBLE_<wbr>FP_<wbr>CONFIG</code></a> <sup class="footnoteref">[<a class="footnote" href="#_footnotedef_8" title="View footnote.">8</a>]</sup></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2. |
| Also see extension <strong>cl_khr_fp64</strong>.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>fp_<wbr>config</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes double precision floating-point capability of the OpenCL |
| device. |
| This is a bit-field that describes one or more of the following |
| values:</p> |
| <p class="tableblock"> <a href="#CL_FP_DENORM"><code>CL_FP_<wbr>DENORM</code></a> - denorms are supported<br> |
| <a href="#CL_FP_INF_NAN"><code>CL_FP_<wbr>INF_<wbr>NAN</code></a> - INF and NaNs are supported<br> |
| <a href="#CL_FP_ROUND_TO_NEAREST"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>NEAREST</code></a> - round to nearest even rounding mode |
| supported<br> |
| <a href="#CL_FP_ROUND_TO_ZERO"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>ZERO</code></a> - round to zero rounding mode supported<br> |
| <a href="#CL_FP_ROUND_TO_INF"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>INF</code></a> - round to positive and negative infinity |
| rounding modes supported<br> |
| <a href="#CL_FP_FMA"><code>CL_FP_<wbr>FMA</code></a> - IEEE754-2008 fused multiply-add is supported<br> |
| <a href="#CL_FP_SOFT_FLOAT"><code>CL_FP_<wbr>SOFT_<wbr>FLOAT</code></a> - Basic floating-point operations (such as |
| addition, subtraction, multiplication) are implemented in software</p> |
| <p class="tableblock"> Double precision is an optional feature so the mandated minimum |
| double precision floating-point capability is 0.</p> |
| <p class="tableblock"> If double precision is supported by the device, then the minimum |
| double precision floating-point capability is:</p> |
| <p class="tableblock"> <a href="#CL_FP_FMA"><code>CL_FP_<wbr>FMA</code></a> |<br> |
| <a href="#CL_FP_ROUND_TO_NEAREST"><code>CL_FP_<wbr>ROUND_<wbr>TO_<wbr>NEAREST</code></a> |<br> |
| <a href="#CL_FP_INF_NAN"><code>CL_FP_<wbr>INF_<wbr>NAN</code></a> |<br> |
| <a href="#CL_FP_DENORM"><code>CL_FP_<wbr>DENORM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_GLOBAL_MEM_CACHE_TYPE"></a><a href="#CL_DEVICE_GLOBAL_MEM_CACHE_TYPE"><code>CL_DEVICE_<wbr>GLOBAL_<wbr>MEM_<wbr>CACHE_<wbr>TYPE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>mem_<wbr>cache_<wbr>type</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Type of global memory cache supported. |
| Valid values are: <a href="#CL_NONE"><code>CL_NONE</code></a>, <a id="CL_READ_ONLY_CACHE"></a><a href="#CL_READ_ONLY_CACHE"><code>CL_READ_<wbr>ONLY_<wbr>CACHE</code></a>, and |
| <a id="CL_READ_WRITE_CACHE"></a><a href="#CL_READ_WRITE_CACHE"><code>CL_READ_<wbr>WRITE_<wbr>CACHE</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE"></a><a href="#CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE"><code>CL_DEVICE_<wbr>GLOBAL_<wbr>MEM_<wbr>CACHELINE_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Size of global memory cache line in bytes.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_GLOBAL_MEM_CACHE_SIZE"></a><a href="#CL_DEVICE_GLOBAL_MEM_CACHE_SIZE"><code>CL_DEVICE_<wbr>GLOBAL_<wbr>MEM_<wbr>CACHE_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_ulong</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Size of global memory cache in bytes.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_GLOBAL_MEM_SIZE"></a><a href="#CL_DEVICE_GLOBAL_MEM_SIZE"><code>CL_DEVICE_<wbr>GLOBAL_<wbr>MEM_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_ulong</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Size of global device memory in bytes.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE"></a><a href="#CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE"><code>CL_DEVICE_<wbr>MAX_<wbr>CONSTANT_<wbr>BUFFER_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_ulong</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max size in bytes of a constant buffer allocation. |
| The minimum value is 64 KB for devices that are not of type |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_CONSTANT_ARGS"></a><a href="#CL_DEVICE_MAX_CONSTANT_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>CONSTANT_<wbr>ARGS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Max number of arguments declared with the <code>__constant</code> qualifier |
| in a kernel. |
| The minimum value is 8 for devices that are not of type |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE"></a><a href="#CL_DEVICE_MAX_GLOBAL_VARIABLE_SIZE"><code>CL_DEVICE_<wbr>MAX_<wbr>GLOBAL_<wbr>VARIABLE_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of bytes of storage that may be allocated for any |
| single variable in program scope or inside a function in an OpenCL |
| kernel language declared in the global address space.</p> |
| <p class="tableblock"> Support for program scope global variables is required for an OpenCL 2.0, |
| 2.1, or 2.2 device. |
| The minimum value is 64 KB if the device supports program scope global |
| variables, and must be 0 for devices that do not support program scope |
| global variables.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE"></a><a href="#CL_DEVICE_GLOBAL_VARIABLE_PREFERRED_TOTAL_SIZE"><code>CL_DEVICE_<wbr>GLOBAL_<wbr>VARIABLE_<wbr>PREFERRED_<wbr>TOTAL_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Maximum preferred total size, in bytes, of all program variables in |
| the global address space. |
| This is a performance hint. |
| An implementation may place such variables in storage with optimized |
| device access. |
| This query returns the capacity of such storage. |
| The minimum value is 0.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_LOCAL_MEM_TYPE"></a><a href="#CL_DEVICE_LOCAL_MEM_TYPE"><code>CL_DEVICE_<wbr>LOCAL_<wbr>MEM_<wbr>TYPE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>local_<wbr>mem_<wbr>type</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Type of local memory supported. |
| This can be set to <a id="CL_LOCAL"></a><a href="#CL_LOCAL"><code>CL_LOCAL</code></a> implying dedicated local memory storage |
| such as SRAM , or <a id="CL_GLOBAL"></a><a href="#CL_GLOBAL"><code>CL_GLOBAL</code></a>.</p> |
| <p class="tableblock"> For custom devices, <a href="#CL_NONE"><code>CL_NONE</code></a> can also be returned indicating no local |
| memory support.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_LOCAL_MEM_SIZE"></a><a href="#CL_DEVICE_LOCAL_MEM_SIZE"><code>CL_DEVICE_<wbr>LOCAL_<wbr>MEM_<wbr>SIZE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_ulong</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Size of local memory region in bytes. |
| The minimum value is 32 KB for devices that are not of type |
| <a href="#CL_DEVICE_TYPE_CUSTOM"><code>CL_DEVICE_<wbr>TYPE_<wbr>CUSTOM</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_ERROR_CORRECTION_SUPPORT"></a><a href="#CL_DEVICE_ERROR_CORRECTION_SUPPORT"><code>CL_DEVICE_<wbr>ERROR_<wbr>CORRECTION_<wbr>SUPPORT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the device implements error correction for all |
| accesses to compute device memory (global and constant). |
| Is <a href="#CL_FALSE"><code>CL_FALSE</code></a> if the device does not implement such error correction.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_HOST_UNIFIED_MEMORY"></a><a href="#CL_DEVICE_HOST_UNIFIED_MEMORY"><code>CL_DEVICE_<wbr>HOST_<wbr>UNIFIED_<wbr>MEMORY</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1 and <a href="#unified-spec">deprecated by</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the device and the host have a unified memory subsystem |
| and is <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PROFILING_TIMER_RESOLUTION"></a><a href="#CL_DEVICE_PROFILING_TIMER_RESOLUTION"><code>CL_DEVICE_<wbr>PROFILING_<wbr>TIMER_<wbr>RESOLUTION</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes the resolution of device timer. |
| This is measured in nanoseconds. |
| Refer to <a href="#profiling-operations">Profiling Operations</a> for details.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_ENDIAN_LITTLE"></a><a href="#CL_DEVICE_ENDIAN_LITTLE"><code>CL_DEVICE_<wbr>ENDIAN_<wbr>LITTLE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the OpenCL device is a little endian device and |
| <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_AVAILABLE"></a><a href="#CL_DEVICE_AVAILABLE"><code>CL_DEVICE_<wbr>AVAILABLE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the device is available and <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise. |
| A device is considered to be available if the device can be expected |
| to successfully execute commands enqueued to the device.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_COMPILER_AVAILABLE"></a><a href="#CL_DEVICE_COMPILER_AVAILABLE"><code>CL_DEVICE_<wbr>COMPILER_<wbr>AVAILABLE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_FALSE"><code>CL_FALSE</code></a> if the implementation does not have a compiler available |
| to compile the program source.</p> |
| <p class="tableblock"> Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the compiler is available. |
| This can be <a href="#CL_FALSE"><code>CL_FALSE</code></a> for the embedded platform profile only.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_LINKER_AVAILABLE"></a><a href="#CL_DEVICE_LINKER_AVAILABLE"><code>CL_DEVICE_<wbr>LINKER_<wbr>AVAILABLE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_FALSE"><code>CL_FALSE</code></a> if the implementation does not have a linker available. |
| Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the linker is available.</p> |
| <p class="tableblock"> This can be <a href="#CL_FALSE"><code>CL_FALSE</code></a> for the embedded platform profile only.</p> |
| <p class="tableblock"> This must be <a href="#CL_TRUE"><code>CL_TRUE</code></a> if <a href="#CL_DEVICE_COMPILER_AVAILABLE"><code>CL_DEVICE_<wbr>COMPILER_<wbr>AVAILABLE</code></a> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_EXECUTION_CAPABILITIES"></a><a href="#CL_DEVICE_EXECUTION_CAPABILITIES"><code>CL_DEVICE_<wbr>EXECUTION_<wbr>CAPABILITIES</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>exec_<wbr>capabilities</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes the execution capabilities of the device. |
| This is a bit-field that describes one or more of the following |
| values:</p> |
| <p class="tableblock"> <a id="CL_EXEC_KERNEL"></a><a href="#CL_EXEC_KERNEL"><code>CL_EXEC_<wbr>KERNEL</code></a> - The OpenCL device can execute OpenCL kernels.<br> |
| <a id="CL_EXEC_NATIVE_KERNEL"></a><a href="#CL_EXEC_NATIVE_KERNEL"><code>CL_EXEC_<wbr>NATIVE_<wbr>KERNEL</code></a> - The OpenCL device can execute native |
| kernels.</p> |
| <p class="tableblock"> The mandated minimum capability is: <a href="#CL_EXEC_KERNEL"><code>CL_EXEC_<wbr>KERNEL</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_QUEUE_PROPERTIES"></a><a href="#CL_DEVICE_QUEUE_PROPERTIES"><code>CL_DEVICE_<wbr>QUEUE_<wbr>PROPERTIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Deprecated by</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_command_<wbr>queue_<wbr>properties</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">See description of <a href="#CL_DEVICE_QUEUE_ON_HOST_PROPERTIES"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>HOST_<wbr>PROPERTIES</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_QUEUE_ON_HOST_PROPERTIES"></a><a href="#CL_DEVICE_QUEUE_ON_HOST_PROPERTIES"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>HOST_<wbr>PROPERTIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_command_<wbr>queue_<wbr>properties</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes the on host command-queue properties supported by the |
| device. |
| This is a bit-field that describes one or more of the following |
| values:</p> |
| <p class="tableblock"> <a href="#CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"><code>CL_QUEUE_<wbr>OUT_<wbr>OF_<wbr>ORDER_<wbr>EXEC_<wbr>MODE_<wbr>ENABLE</code></a><br> |
| <a href="#CL_QUEUE_PROFILING_ENABLE"><code>CL_QUEUE_<wbr>PROFILING_<wbr>ENABLE</code></a></p> |
| <p class="tableblock"> These properties are described in the <a href="#queue-properties-table">Queue Properties</a> table.</p> |
| <p class="tableblock"> The mandated minimum capability is: <a href="#CL_QUEUE_PROFILING_ENABLE"><code>CL_QUEUE_<wbr>PROFILING_<wbr>ENABLE</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES"></a><a href="#CL_DEVICE_QUEUE_ON_DEVICE_PROPERTIES"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>PROPERTIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_command_<wbr>queue_<wbr>properties</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes the on device command-queue properties supported by the |
| device. |
| This is a bit-field that describes one or more of the following |
| values:</p> |
| <p class="tableblock"> <a href="#CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"><code>CL_QUEUE_<wbr>OUT_<wbr>OF_<wbr>ORDER_<wbr>EXEC_<wbr>MODE_<wbr>ENABLE</code></a><br> |
| <a href="#CL_QUEUE_PROFILING_ENABLE"><code>CL_QUEUE_<wbr>PROFILING_<wbr>ENABLE</code></a></p> |
| <p class="tableblock"> These properties are described in the <a href="#queue-properties-table">Queue Properties</a> table.</p> |
| <p class="tableblock"> Support for on-device queues is required for an OpenCL 2.0, 2.1, or 2.2 device. |
| When on-device queues are supported, the mandated minimum capability is:</p> |
| <p class="tableblock"> <a href="#CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"><code>CL_QUEUE_<wbr>OUT_<wbr>OF_<wbr>ORDER_<wbr>EXEC_<wbr>MODE_<wbr>ENABLE</code></a> |<br> |
| <a href="#CL_QUEUE_PROFILING_ENABLE"><code>CL_QUEUE_<wbr>PROFILING_<wbr>ENABLE</code></a>.</p> |
| <p class="tableblock"> Must be 0 for devices that do not support on-device queues.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE"></a><a href="#CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>PREFERRED_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The preferred size of the device queue, in bytes. |
| Applications should use this size for the device queue to ensure |
| good performance.</p> |
| <p class="tableblock"> The minimum value is 16 KB for devices supporting on-device queues, |
| and must be 0 for devices that do not support on-device queues.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE"></a><a href="#CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>MAX_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The maximum size of the device queue in bytes.</p> |
| <p class="tableblock"> The minimum value is 256 KB for the full profile and 64 KB for the |
| embedded profile for devices supporting on-device queues, |
| and must be 0 for devices that do not support on-device queues.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_ON_DEVICE_QUEUES"></a><a href="#CL_DEVICE_MAX_ON_DEVICE_QUEUES"><code>CL_DEVICE_<wbr>MAX_<wbr>ON_<wbr>DEVICE_<wbr>QUEUES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of device queues that can be created for this |
| device in a single context.</p> |
| <p class="tableblock"> The minimum value is 1 for devices supporting on-device queues, |
| and must be 0 for devices that do not support on-device queues.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_ON_DEVICE_EVENTS"></a><a href="#CL_DEVICE_MAX_ON_DEVICE_EVENTS"><code>CL_DEVICE_<wbr>MAX_<wbr>ON_<wbr>DEVICE_<wbr>EVENTS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The maximum number of events in use by a device queue. |
| These refer to events returned by the <code>enqueue_</code> built-in functions |
| to a device queue or user events returned by the <code>create_user_event</code> |
| built-in function that have not been released.</p> |
| <p class="tableblock"> The minimum value is 1024 for devices supporting on-device queues, |
| and must be 0 for devices that do not support on-device queues.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_BUILT_IN_KERNELS"></a><a href="#CL_DEVICE_BUILT_IN_KERNELS"><code>CL_DEVICE_<wbr>BUILT_<wbr>IN_<wbr>KERNELS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A semi-colon separated list of built-in kernels supported by the |
| device. |
| An empty string is returned if no built-in kernels are supported by |
| the device.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION"></a><a href="#CL_DEVICE_BUILT_IN_KERNELS_WITH_VERSION"><code>CL_DEVICE_<wbr>BUILT_<wbr>IN_<wbr>KERNELS_<wbr>WITH_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#cl_name_version"><code>cl_name_<wbr>version</code></a>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns an array of descriptions for the built-in kernels supported by |
| the device. Each built-in kernel may only be reported once. The list of |
| reported kernels must match the list returned via |
| <a href="#CL_DEVICE_BUILT_IN_KERNELS"><code>CL_DEVICE_<wbr>BUILT_<wbr>IN_<wbr>KERNELS</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PLATFORM"></a><a href="#CL_DEVICE_PLATFORM"><code>CL_DEVICE_<wbr>PLATFORM</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_platform_<wbr>id</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The platform associated with this device.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_NAME"></a><a href="#CL_DEVICE_NAME"><code>CL_DEVICE_<wbr>NAME</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Device name string.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_VENDOR"></a><a href="#CL_DEVICE_VENDOR"><code>CL_DEVICE_<wbr>VENDOR</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Vendor name string.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DRIVER_VERSION"></a><a href="#CL_DRIVER_VERSION"><code>CL_DRIVER_<wbr>VERSION</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL software driver version string. |
| Follows a vendor-specific format.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PROFILE"></a><a href="#CL_DEVICE_PROFILE"><code>CL_DEVICE_<wbr>PROFILE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL profile string. |
| Returns the profile name supported by the device. |
| The profile name returned can be one of the following strings:</p> |
| <p class="tableblock"> FULL_PROFILE - if the device supports the OpenCL specification |
| (functionality defined as part of the core specification and does |
| not require any extensions to be supported).</p> |
| <p class="tableblock"> EMBEDDED_PROFILE - if the device supports the OpenCL embedded |
| profile.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_VERSION"></a><a href="#CL_DEVICE_VERSION"><code>CL_DEVICE_<wbr>VERSION</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">OpenCL version string. |
| Returns the OpenCL version supported by the device. This version |
| string has the following format:</p> |
| <p class="tableblock"> <em>OpenCL<space><major_version.minor_version><space><vendor-specific |
| information></em></p> |
| <p class="tableblock"> The major_version.minor_version value returned will be one of 1.0, |
| 1.1, 1.2, 2.0, 2.1, 2.2, or 3.0.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_NUMERIC_VERSION"></a><a href="#CL_DEVICE_NUMERIC_VERSION"><code>CL_DEVICE_<wbr>NUMERIC_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_version</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the detailed (major, minor, patch) version supported by the |
| device. The major and minor version numbers returned must match |
| those returned via <a href="#CL_DEVICE_VERSION"><code>CL_DEVICE_<wbr>VERSION</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_OPENCL_C_VERSION"></a><a href="#CL_DEVICE_OPENCL_C_VERSION"><code>CL_DEVICE_<wbr>OPENCL_<wbr>C_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1 and <a href="#unified-spec">deprecated by</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the highest fully backwards compatible OpenCL C version |
| supported by the compiler for the device. |
| For devices supporting compilation from OpenCL C source, this will |
| return a version string with the following format:</p> |
| <p class="tableblock"> <em>OpenCL<space>C<space><major_version.minor_version><space><vendor-specific |
| information></em></p> |
| <p class="tableblock"> For devices that support compilation from OpenCL C source:</p> |
| <p class="tableblock"> Because OpenCL 3.0 is backwards compatible with OpenCL C 1.2, |
| an OpenCL 3.0 device must support at least OpenCL C 1.2. |
| An OpenCL 3.0 device may return an OpenCL C version newer |
| than OpenCL C 1.2 if and only if all optional OpenCL C |
| features are supported by the device for the newer version.</p> |
| <p class="tableblock"> Support for OpenCL C 2.0 is required for an OpenCL 2.0, OpenCL 2.1, |
| or OpenCL 2.2 device.</p> |
| <p class="tableblock"> Support for OpenCL C 1.2 is required for an OpenCL 1.2 device.</p> |
| <p class="tableblock"> Support for OpenCL C 1.1 is required for an OpenCL 1.1 device.</p> |
| <p class="tableblock"> Support for either OpenCL C 1.0 or OpenCL C 1.1 is required for |
| an OpenCL 1.0 device.</p> |
| <p class="tableblock"> For devices that do not support compilation from OpenCL C source, |
| such as when <a href="#CL_DEVICE_COMPILER_AVAILABLE"><code>CL_DEVICE_<wbr>COMPILER_<wbr>AVAILABLE</code></a> is <a href="#CL_FALSE"><code>CL_FALSE</code></a>, this |
| query may return an empty string.</p> |
| <p class="tableblock"> This query has been superseded by the <a href="#CL_DEVICE_OPENCL_C_ALL_VERSIONS"><code>CL_DEVICE_<wbr>OPENCL_<wbr>C_<wbr>ALL_<wbr>VERSIONS</code></a> |
| query, which returns a set of OpenCL C versions supported by a |
| device.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_OPENCL_C_ALL_VERSIONS"></a><a href="#CL_DEVICE_OPENCL_C_ALL_VERSIONS"><code>CL_DEVICE_<wbr>OPENCL_<wbr>C_<wbr>ALL_<wbr>VERSIONS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#cl_name_version"><code>cl_name_<wbr>version</code></a>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns an array of name, version descriptions listing all the versions |
| of OpenCL C supported by the compiler for the device. |
| In each returned description structure, the name field is required to be |
| "OpenCL C". The list may include both newer non-backwards compatible |
| OpenCL C versions, such as OpenCL C 3.0, and older OpenCL C versions |
| with mandatory backwards compatibility. |
| The version returned by <a href="#CL_DEVICE_OPENCL_C_VERSION"><code>CL_DEVICE_<wbr>OPENCL_<wbr>C_<wbr>VERSION</code></a> is required to be |
| present in the list.</p> |
| <p class="tableblock"> For devices that support compilation from OpenCL C source:</p> |
| <p class="tableblock"> Because OpenCL 3.0 is backwards compatible with OpenCL C 1.2, |
| and OpenCL C 1.2 is backwards compatible with OpenCL C 1.1 and |
| OpenCL C 1.0, support for at least OpenCL C 3.0, OpenCL C 1.2, |
| OpenCL C 1.1, and OpenCL C 1.0 is required for an OpenCL 3.0 device.</p> |
| <p class="tableblock"> Support for OpenCL C 2.0, OpenCL C 1.2, OpenCL C 1.1, and OpenCL C |
| 1.0 is required for an OpenCL 2.0, OpenCL 2.1, or OpenCL 2.2 device.</p> |
| <p class="tableblock"> Support for OpenCL C 1.2, OpenCL C 1.1, and OpenCL C 1.0 is required |
| for an OpenCL 1.2 device.</p> |
| <p class="tableblock"> Support for OpenCL C 1.1 and OpenCL C 1.0 is required for an |
| OpenCL 1.1 device.</p> |
| <p class="tableblock"> Support for at least OpenCL C 1.0 is required for an OpenCL 1.0 device.</p> |
| <p class="tableblock"> For devices that do not support compilation from OpenCL C source, |
| this query may return an empty array.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_OPENCL_C_FEATURES"></a><a href="#CL_DEVICE_OPENCL_C_FEATURES"><code>CL_DEVICE_<wbr>OPENCL_<wbr>C_<wbr>FEATURES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#cl_name_version"><code>cl_name_<wbr>version</code></a>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns an array of optional OpenCL C features supported by the |
| compiler for the device alongside the OpenCL C version that introduced |
| the feature macro. |
| For example, if a compiler supports an OpenCL C 3.0 feature, the |
| returned name will be the full name of the OpenCL C feature macro, and |
| the returned version will be 3.0.0.</p> |
| <p class="tableblock"> For devices that do not support compilation from OpenCL C source, |
| this query may return an empty array.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_EXTENSIONS"></a><a href="#CL_DEVICE_EXTENSIONS"><code>CL_DEVICE_<wbr>EXTENSIONS</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns a space separated list of extension names (the extension |
| names themselves do not contain any spaces) supported by the device. |
| The list of extension names may include Khronos approved extension |
| names and vendor specified extension names.</p> |
| <p class="tableblock"> The following Khronos extension names must be returned by |
| all devices that support OpenCL 1.1:</p> |
| <p class="tableblock"> <strong>cl_khr_byte_addressable_store</strong><br> |
| <strong>cl_khr_global_int32_base_atomics</strong><br> |
| <strong>cl_khr_global_int32_extended_atomics</strong><br> |
| <strong>cl_khr_local_int32_base_atomics</strong><br> |
| <strong>cl_khr_local_int32_extended_atomics</strong></p> |
| <p class="tableblock"> Additionally, the following Khronos extension names must be returned |
| by all devices that support OpenCL 1.2 when and only when the optional |
| feature is supported:</p> |
| <p class="tableblock"> <strong>cl_khr_fp64</strong></p> |
| <p class="tableblock"> Additionally, the following Khronos extension names must be returned |
| by all devices that support OpenCL 2.0, OpenCL 2.1, or OpenCL 2.2. |
| For devices that support OpenCL 3.0, these extension names must |
| be returned when and only when the optional feature is supported:</p> |
| <p class="tableblock"> <strong>cl_khr_3d_image_writes</strong><br> |
| <strong>cl_khr_depth_images</strong><br> |
| <strong>cl_khr_image2d_from_buffer</strong></p> |
| <p class="tableblock"> Please refer to the OpenCL Extension Specification or vendor |
| provided documentation for a detailed description of these extensions.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_EXTENSIONS_WITH_VERSION"></a><a href="#CL_DEVICE_EXTENSIONS_WITH_VERSION"><code>CL_DEVICE_<wbr>EXTENSIONS_<wbr>WITH_<wbr>VERSION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#cl_name_version"><code>cl_name_<wbr>version</code></a>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns an array of description (name and version) structures. The same |
| extension name must not be reported more than once. The list of |
| extensions reported must match the list reported via |
| <a href="#CL_DEVICE_EXTENSIONS"><code>CL_DEVICE_<wbr>EXTENSIONS</code></a>.</p> |
| <p class="tableblock"> See <a id="CL_DEVICE_EXTENSIONS"></a><a href="#CL_DEVICE_EXTENSIONS"><code>CL_DEVICE_<wbr>EXTENSIONS</code></a> for a list of extensions that are |
| required to be reported for a given OpenCL version.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PRINTF_BUFFER_SIZE"></a><a href="#CL_DEVICE_PRINTF_BUFFER_SIZE"><code>CL_DEVICE_<wbr>PRINTF_<wbr>BUFFER_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Maximum size in bytes of the internal buffer that holds the output |
| of printf calls from a kernel. |
| The minimum value for the FULL profile is 1 MB.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PREFERRED_INTEROP_USER_SYNC"></a><a href="#CL_DEVICE_PREFERRED_INTEROP_USER_SYNC"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>INTEROP_<wbr>USER_<wbr>SYNC</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the devices preference is for the user to be |
| responsible for synchronization, when sharing memory objects between |
| OpenCL and other APIs such as DirectX, <a href="#CL_FALSE"><code>CL_FALSE</code></a> if the device / |
| implementation has a performant path for performing synchronization |
| of memory object shared between OpenCL and other APIs such as |
| DirectX.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARENT_DEVICE"></a><a href="#CL_DEVICE_PARENT_DEVICE"><code>CL_DEVICE_<wbr>PARENT_<wbr>DEVICE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>id</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the <code>cl_device_<wbr>id</code> of the parent device to which this |
| sub-device belongs. |
| If <em>device</em> is a root-level device, a <code>NULL</code> value is returned.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARTITION_MAX_SUB_DEVICES"></a><a href="#CL_DEVICE_PARTITION_MAX_SUB_DEVICES"><code>CL_DEVICE_<wbr>PARTITION_<wbr>MAX_<wbr>SUB_<wbr>DEVICES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the maximum number of sub-devices that can be created when a |
| device is partitioned.</p> |
| <p class="tableblock"> The value returned cannot exceed <a href="#CL_DEVICE_MAX_COMPUTE_UNITS"><code>CL_DEVICE_<wbr>MAX_<wbr>COMPUTE_<wbr>UNITS</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARTITION_PROPERTIES"></a><a href="#CL_DEVICE_PARTITION_PROPERTIES"><code>CL_DEVICE_<wbr>PARTITION_<wbr>PROPERTIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>partition_<wbr>property</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the list of partition types supported by <em>device</em>. |
| This is an array of <code>cl_device_<wbr>partition_<wbr>property</code> values drawn from |
| the following list:</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_PARTITION_EQUALLY"><code>CL_DEVICE_<wbr>PARTITION_<wbr>EQUALLY</code></a><br> |
| <a href="#CL_DEVICE_PARTITION_BY_COUNTS"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>COUNTS</code></a><br> |
| <a href="#CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>AFFINITY_<wbr>DOMAIN</code></a></p> |
| <p class="tableblock"> If the device cannot be partitioned (i.e. there is no partitioning |
| scheme supported by the device that will return at least two |
| subdevices), a value of 0 will be returned.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARTITION_AFFINITY_DOMAIN"></a><a href="#CL_DEVICE_PARTITION_AFFINITY_DOMAIN"><code>CL_DEVICE_<wbr>PARTITION_<wbr>AFFINITY_<wbr>DOMAIN</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>affinity_<wbr>domain</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the list of supported affinity domains for partitioning the |
| device using <a href="#CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>AFFINITY_<wbr>DOMAIN</code></a>. |
| This is a bit-field that describes one or more of the following |
| values:</p> |
| <p class="tableblock"> <a id="CL_DEVICE_AFFINITY_DOMAIN_NUMA"></a><a href="#CL_DEVICE_AFFINITY_DOMAIN_NUMA"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>NUMA</code></a><br> |
| <a id="CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE"></a><a href="#CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L4_<wbr>CACHE</code></a><br> |
| <a id="CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE"></a><a href="#CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L3_<wbr>CACHE</code></a><br> |
| <a id="CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE"></a><a href="#CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L2_<wbr>CACHE</code></a><br> |
| <a id="CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE"></a><a href="#CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L1_<wbr>CACHE</code></a><br> |
| <a id="CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE"></a><a href="#CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>NEXT_<wbr>PARTITIONABLE</code></a></p> |
| <p class="tableblock"> If the device does not support any affinity domains, a value of 0 |
| will be returned.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARTITION_TYPE"></a><a href="#CL_DEVICE_PARTITION_TYPE"><code>CL_DEVICE_<wbr>PARTITION_<wbr>TYPE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>partition_<wbr>property</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the properties argument specified in <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> if |
| device is a sub-device. |
| In the case where the properties argument to <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> is |
| <a href="#CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>AFFINITY_<wbr>DOMAIN</code></a>, |
| <a href="#CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>NEXT_<wbr>PARTITIONABLE</code></a>, the affinity domain |
| used to perform the partition will be returned. |
| This can be one of the following values:</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_AFFINITY_DOMAIN_NUMA"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>NUMA</code></a><br> |
| <a href="#CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L4_<wbr>CACHE</code></a><br> |
| <a href="#CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L3_<wbr>CACHE</code></a><br> |
| <a href="#CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L2_<wbr>CACHE</code></a><br> |
| <a href="#CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L1_<wbr>CACHE</code></a></p> |
| <p class="tableblock"> Otherwise the implementation may either return a |
| <em>param_value_size_ret</em> of 0 i.e. there is no partition type |
| associated with device or can return a property value of 0 (where 0 |
| is used to terminate the partition property list) in the memory that |
| <em>param_value</em> points to.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_REFERENCE_COUNT"></a><a href="#CL_DEVICE_REFERENCE_COUNT"><code>CL_DEVICE_<wbr>REFERENCE_<wbr>COUNT</code></a> <sup class="footnote">[<a id="_footnoteref_9" class="footnote" href="#_footnotedef_9" title="View footnote.">9</a>]</sup></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the <em>device</em> reference count. |
| If the device is a root-level device, a reference count of one is |
| returned.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_SVM_CAPABILITIES"></a><a href="#CL_DEVICE_SVM_CAPABILITIES"><code>CL_DEVICE_<wbr>SVM_<wbr>CAPABILITIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>svm_<wbr>capabilities</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes the various shared virtual memory (SVM) memory |
| allocation types the device supports. |
| This is a bit-field that describes a combination of the following |
| values:</p> |
| <p class="tableblock"> <a id="CL_DEVICE_SVM_COARSE_GRAIN_BUFFER"></a><a href="#CL_DEVICE_SVM_COARSE_GRAIN_BUFFER"><code>CL_DEVICE_<wbr>SVM_<wbr>COARSE_<wbr>GRAIN_<wbr>BUFFER</code></a> - Support for coarse-grain buffer |
| sharing using <a href="#clSVMAlloc"><strong>clSVMAlloc</strong></a>. |
| Memory consistency is guaranteed at synchronization points and the |
| host must use calls to <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> and |
| <a href="#clEnqueueUnmapMemObject"><strong>clEnqueueUnmapMemObject</strong></a>.<br> |
| <a id="CL_DEVICE_SVM_FINE_GRAIN_BUFFER"></a><a href="#CL_DEVICE_SVM_FINE_GRAIN_BUFFER"><code>CL_DEVICE_<wbr>SVM_<wbr>FINE_<wbr>GRAIN_<wbr>BUFFER</code></a> - Support for fine-grain buffer |
| sharing using <a href="#clSVMAlloc"><strong>clSVMAlloc</strong></a>. |
| Memory consistency is guaranteed at synchronization points without |
| need for <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> and <a href="#clEnqueueUnmapMemObject"><strong>clEnqueueUnmapMemObject</strong></a>.<br> |
| <a id="CL_DEVICE_SVM_FINE_GRAIN_SYSTEM"></a><a href="#CL_DEVICE_SVM_FINE_GRAIN_SYSTEM"><code>CL_DEVICE_<wbr>SVM_<wbr>FINE_<wbr>GRAIN_<wbr>SYSTEM</code></a> - Support for sharing the host’s |
| entire virtual memory including memory allocated using <strong>malloc</strong>. |
| Memory consistency is guaranteed at synchronization points.<br> |
| <a id="CL_DEVICE_SVM_ATOMICS"></a><a href="#CL_DEVICE_SVM_ATOMICS"><code>CL_DEVICE_<wbr>SVM_<wbr>ATOMICS</code></a> - Support for the OpenCL 2.0 atomic |
| operations that provide memory consistency across the host and all |
| OpenCL devices supporting fine-grain SVM allocations.</p> |
| <p class="tableblock"> The mandated minimum capability for an OpenCL 2.0, 2.1, or 2.2 device is |
| <a href="#CL_DEVICE_SVM_COARSE_GRAIN_BUFFER"><code>CL_DEVICE_<wbr>SVM_<wbr>COARSE_<wbr>GRAIN_<wbr>BUFFER</code></a>.</p> |
| <p class="tableblock"> For other device versions there is no mandated minimum capability.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT"></a><a href="#CL_DEVICE_PREFERRED_PLATFORM_ATOMIC_ALIGNMENT"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>PLATFORM_<wbr>ATOMIC_<wbr>ALIGNMENT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the value representing the preferred alignment in bytes for |
| OpenCL 2.0 fine-grained SVM atomic types. |
| This query can return 0 which indicates that the preferred alignment |
| is aligned to the natural size of the type.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT"></a><a href="#CL_DEVICE_PREFERRED_GLOBAL_ATOMIC_ALIGNMENT"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>GLOBAL_<wbr>ATOMIC_<wbr>ALIGNMENT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the value representing the preferred alignment in bytes for |
| OpenCL 2.0 atomic types to global memory. |
| This query can return 0 which indicates that the preferred alignment |
| is aligned to the natural size of the type.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT"></a><a href="#CL_DEVICE_PREFERRED_LOCAL_ATOMIC_ALIGNMENT"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>LOCAL_<wbr>ATOMIC_<wbr>ALIGNMENT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the value representing the preferred alignment in bytes for |
| OpenCL 2.0 atomic types to local memory. |
| This query can return 0 which indicates that the preferred alignment |
| is aligned to the natural size of the type.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_MAX_NUM_SUB_GROUPS"></a><a href="#CL_DEVICE_MAX_NUM_SUB_GROUPS"><code>CL_DEVICE_<wbr>MAX_<wbr>NUM_<wbr>SUB_<wbr>GROUPS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Maximum number of sub-groups in a work-group that a device is |
| capable of executing on a single compute unit, for any given |
| kernel-instance running on the device.</p> |
| <p class="tableblock"> The minimum value is 1 if the device supports subgroups, and must be |
| 0 for devices that do not support subgroups. |
| Support for subgroups is required for an OpenCL 2.1 or 2.2 device.</p> |
| <p class="tableblock"> (Refer also to <a href="#clGetKernelSubGroupInfo"><strong>clGetKernelSubGroupInfo</strong></a>.)</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS"></a><a href="#CL_DEVICE_SUB_GROUP_INDEPENDENT_FORWARD_PROGRESS"><code>CL_DEVICE_<wbr>SUB_<wbr>GROUP_<wbr>INDEPENDENT_<wbr>FORWARD_<wbr>PROGRESS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if this device supports independent forward progress of |
| sub-groups, <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise.</p> |
| <p class="tableblock"> This query must return <a href="#CL_TRUE"><code>CL_TRUE</code></a> for devices that support the |
| <strong>cl_khr_subgroups</strong> extension, and must return <a href="#CL_FALSE"><code>CL_FALSE</code></a> for |
| devices that do not support subgroups.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES"></a><a href="#CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>MEMORY_<wbr>CAPABILITIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>atomic_<wbr>capabilities</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes the various memory orders and scopes that the device supports for atomic memory operations. |
| This is a bit-field that describes a combination of the following |
| values:</p> |
| <p class="tableblock"> <a id="CL_DEVICE_ATOMIC_ORDER_RELAXED"></a><a href="#CL_DEVICE_ATOMIC_ORDER_RELAXED"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>RELAXED</code></a> - Support for the <strong>relaxed</strong> memory order.<br> |
| <a id="CL_DEVICE_ATOMIC_ORDER_ACQ_REL"></a><a href="#CL_DEVICE_ATOMIC_ORDER_ACQ_REL"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>ACQ_<wbr>REL</code></a> - Support for the <strong>acquire</strong>, <strong>release</strong>, and <strong>acquire-release</strong> memory orders.<br> |
| <a id="CL_DEVICE_ATOMIC_ORDER_SEQ_CST"></a><a href="#CL_DEVICE_ATOMIC_ORDER_SEQ_CST"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>SEQ_<wbr>CST</code></a> - Support for the <strong>sequentially consistent</strong> memory order.</p> |
| <p class="tableblock"> Because atomic memory orders are hierarchical, a device that supports a strong memory order must also support all weaker memory orders.</p> |
| <p class="tableblock"> <a id="CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM"></a><a href="#CL_DEVICE_ATOMIC_SCOPE_WORK_ITEM"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>WORK_<wbr>ITEM</code></a> <sup class="footnote">[<a id="_footnoteref_10" class="footnote" href="#_footnotedef_10" title="View footnote.">10</a>]</sup> - Support for memory ordering constraints that apply to a single work-item.<br> |
| <a id="CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP"></a><a href="#CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>WORK_<wbr>GROUP</code></a> - Support for memory ordering constraints that apply to all work-items in a work-group.<br> |
| <a id="CL_DEVICE_ATOMIC_SCOPE_DEVICE"></a><a href="#CL_DEVICE_ATOMIC_SCOPE_DEVICE"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>DEVICE</code></a> - Support for memory ordering constraints that apply to all work-items executing on the device.<br> |
| <a id="CL_DEVICE_ATOMIC_SCOPE_ALL_DEVICES"></a><a href="#CL_DEVICE_ATOMIC_SCOPE_ALL_DEVICES"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>ALL_<wbr>DEVICES</code></a> - Support for memory ordering constraints that apply to all work-items executing across all devices that can share SVM memory with each other and the host process.</p> |
| <p class="tableblock"> Because atomic scopes are hierarchical, a device that supports a wide scope must also support all narrower scopes, except for the work-item scope, which is a special case.</p> |
| <p class="tableblock"> The mandated minimum capability is:</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_ATOMIC_ORDER_RELAXED"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>RELAXED</code></a> |<br> |
| <a href="#CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>WORK_<wbr>GROUP</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_ATOMIC_FENCE_CAPABILITIES"></a><a href="#CL_DEVICE_ATOMIC_FENCE_CAPABILITIES"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>FENCE_<wbr>CAPABILITIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>atomic_<wbr>capabilities</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes the various memory orders and scopes that the device supports for atomic fence operations. |
| This is a bit-field that has the same set of possible values as described for <a href="#CL_DEVICE_ATOMIC_MEMORY_CAPABILITIES"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>MEMORY_<wbr>CAPABILITIES</code></a>.</p> |
| <p class="tableblock"> The mandated minimum capability is:</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_ATOMIC_ORDER_RELAXED"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>RELAXED</code></a> |<br> |
| <a href="#CL_DEVICE_ATOMIC_ORDER_ACQ_REL"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>ORDER_<wbr>ACQ_<wbr>REL</code></a> |<br> |
| <a href="#CL_DEVICE_ATOMIC_SCOPE_WORK_GROUP"><code>CL_DEVICE_<wbr>ATOMIC_<wbr>SCOPE_<wbr>WORK_<wbr>GROUP</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT"></a><a href="#CL_DEVICE_NON_UNIFORM_WORK_GROUP_SUPPORT"><code>CL_DEVICE_<wbr>NON_<wbr>UNIFORM_<wbr>WORK_<wbr>GROUP_<wbr>SUPPORT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the device supports non-uniform work-groups, and <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT"></a><a href="#CL_DEVICE_WORK_GROUP_COLLECTIVE_FUNCTIONS_SUPPORT"><code>CL_DEVICE_<wbr>WORK_<wbr>GROUP_<wbr>COLLECTIVE_<wbr>FUNCTIONS_<wbr>SUPPORT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the device supports work-group collective functions e.g. <code>work_group_broadcast</code>, <code>work_group_reduce</code>, and <code>work_group_scan</code>, and <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT"></a><a href="#CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT"><code>CL_DEVICE_<wbr>GENERIC_<wbr>ADDRESS_<wbr>SPACE_<wbr>SUPPORT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the device supports the generic address space and its associated built-in functions, and <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES"></a><a href="#CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES"><code>CL_DEVICE_<wbr>DEVICE_<wbr>ENQUEUE_<wbr>CAPABILITIES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>device_<wbr>enqueue_<wbr>capabilities</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Describes device-side enqueue capabilities of the device. |
| This is a bit-field that describes one or more of the following |
| values:</p> |
| <p class="tableblock"> <a id="CL_DEVICE_QUEUE_SUPPORTED"></a><a href="#CL_DEVICE_QUEUE_SUPPORTED"><code>CL_DEVICE_<wbr>QUEUE_<wbr>SUPPORTED</code></a> - Device supports device-side enqueue and on-device queues.<br> |
| <a id="CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT"></a><a href="#CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT"><code>CL_DEVICE_<wbr>QUEUE_<wbr>REPLACEABLE_<wbr>DEFAULT</code></a> - Device supports a replaceable default on-device queue.</p> |
| <p class="tableblock"> If <a href="#CL_DEVICE_QUEUE_REPLACEABLE_DEFAULT"><code>CL_DEVICE_<wbr>QUEUE_<wbr>REPLACEABLE_<wbr>DEFAULT</code></a> is set, <a href="#CL_DEVICE_QUEUE_SUPPORTED"><code>CL_DEVICE_<wbr>QUEUE_<wbr>SUPPORTED</code></a> must also be set.</p> |
| <p class="tableblock"> Devices that set <a href="#CL_DEVICE_QUEUE_SUPPORTED"><code>CL_DEVICE_<wbr>QUEUE_<wbr>SUPPORTED</code></a> for <a href="#CL_DEVICE_DEVICE_ENQUEUE_CAPABILITIES"><code>CL_DEVICE_<wbr>DEVICE_<wbr>ENQUEUE_<wbr>CAPABILITIES</code></a> must also return <a href="#CL_TRUE"><code>CL_TRUE</code></a> for <a href="#CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT"><code>CL_DEVICE_<wbr>GENERIC_<wbr>ADDRESS_<wbr>SPACE_<wbr>SUPPORT</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PIPE_SUPPORT"></a><a href="#CL_DEVICE_PIPE_SUPPORT"><code>CL_DEVICE_<wbr>PIPE_<wbr>SUPPORT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Is <a href="#CL_TRUE"><code>CL_TRUE</code></a> if the device supports pipes, and <a href="#CL_FALSE"><code>CL_FALSE</code></a> otherwise.</p> |
| <p class="tableblock"> Devices that return <a href="#CL_TRUE"><code>CL_TRUE</code></a> for <a href="#CL_DEVICE_PIPE_SUPPORT"><code>CL_DEVICE_<wbr>PIPE_<wbr>SUPPORT</code></a> must also return <a href="#CL_TRUE"><code>CL_TRUE</code></a> for <a href="#CL_DEVICE_GENERIC_ADDRESS_SPACE_SUPPORT"><code>CL_DEVICE_<wbr>GENERIC_<wbr>ADDRESS_<wbr>SPACE_<wbr>SUPPORT</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE"></a><a href="#CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>WORK_<wbr>GROUP_<wbr>SIZE_<wbr>MULTIPLE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>size_t</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the preferred multiple of work-group size for the given device. |
| This is a performance hint intended as a guide when specifying the local work size argument to <a href="#clEnqueueNDRangeKernel"><strong>clEnqueueNDRangeKernel</strong></a>.</p> |
| <p class="tableblock"> (Refer also to <a href="#clGetKernelWorkGroupInfo"><strong>clGetKernelWorkGroupInfo</strong></a> where <a href="#CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE"><code>CL_KERNEL_<wbr>PREFERRED_<wbr>WORK_<wbr>GROUP_<wbr>SIZE_<wbr>MULTIPLE</code></a> |
| can return a different value to <a href="#CL_DEVICE_PREFERRED_WORK_GROUP_SIZE_MULTIPLE"><code>CL_DEVICE_<wbr>PREFERRED_<wbr>WORK_<wbr>GROUP_<wbr>SIZE_<wbr>MULTIPLE</code></a> which may be more optimal.)</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED"></a><a href="#CL_DEVICE_LATEST_CONFORMANCE_VERSION_PASSED"><code>CL_DEVICE_<wbr>LATEST_<wbr>CONFORMANCE_<wbr>VERSION_<wbr>PASSED</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>char</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the latest version of the conformance test suite that this device |
| has fully passed in accordance with the official conformance process.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><a href="#clGetDeviceInfo"><strong>clGetDeviceInfo</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>param_name</em> is not one of the supported values or |
| if size in bytes specified by <em>param_value_size</em> is < size of return |
| type as specified in the <a href="#device-queries-table">Device Queries</a> table |
| and <em>param_value</em> is not a <code>NULL</code> value or if <em>param_name</em> is a value |
| that is available as an extension and the corresponding extension is not |
| supported by the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To query device and host timestamps, call the function:</p> |
| </div> |
| <div id="clGetDeviceAndHostTimer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetDeviceAndHostTimer( |
| cl_device_id device, |
| cl_ulong* device_timestamp, |
| cl_ulong* host_timestamp);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clGetDeviceAndHostTimer"><strong>clGetDeviceAndHostTimer</strong></a> is <a href="#unified-spec">missing before</a> version 2.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>device</em> is a device returned by <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a>.</p> |
| </li> |
| <li> |
| <p><em>device_timestamp</em> will be updated with the value of the device timer in |
| nanoseconds. |
| The resolution of the timer is the same as the device profiling timer |
| returned by <a href="#clGetDeviceInfo"><strong>clGetDeviceInfo</strong></a> and the <a href="#CL_DEVICE_PROFILING_TIMER_RESOLUTION"><code>CL_DEVICE_<wbr>PROFILING_<wbr>TIMER_<wbr>RESOLUTION</code></a> |
| query.</p> |
| </li> |
| <li> |
| <p><em>host_timestamp</em> will be updated with the value of the host timer in |
| nanoseconds at the closest possible point in time to that at which |
| <em>device_timer</em> was returned. |
| The resolution of the timer may be queried via <a href="#clGetPlatformInfo"><strong>clGetPlatformInfo</strong></a> and the |
| flag <a href="#CL_PLATFORM_HOST_TIMER_RESOLUTION"><code>CL_PLATFORM_<wbr>HOST_<wbr>TIMER_<wbr>RESOLUTION</code></a>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetDeviceAndHostTimer"><strong>clGetDeviceAndHostTimer</strong></a> returns a reasonably synchronized pair of |
| timestamps from the device timer and the host timer as seen by <em>device</em>. |
| Implementations may need to execute this query with a high latency in order |
| to provide reasonable synchronization of the timestamps. |
| The host timestamp and device timestamp returned by this function and |
| <a href="#clGetHostTimer"><strong>clGetHostTimer</strong></a> each have an implementation defined timebase. |
| The timestamps will always be in their respective timebases regardless of |
| which query function is used. |
| The timestamp returned from <a href="#clGetEventProfilingInfo"><strong>clGetEventProfilingInfo</strong></a> for an event on a |
| device and a device timestamp queried from the same device will always be in |
| the same timebase.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetDeviceAndHostTimer"><strong>clGetDeviceAndHostTimer</strong></a> will return <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> with a time value in |
| <em>host_timestamp</em> if provided. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if the platform associated with <em>device</em> does not |
| support device and host timer synchronization.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>host_timestamp</em> or <em>device_timestamp</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To query the host clock, call the function:</p> |
| </div> |
| <div id="clGetHostTimer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetHostTimer( |
| cl_device_id device, |
| cl_ulong* host_timestamp);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clGetHostTimer"><strong>clGetHostTimer</strong></a> is <a href="#unified-spec">missing before</a> version 2.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>device</em> is a device returned by <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a>.</p> |
| </li> |
| <li> |
| <p><em>host_timestamp</em> will be updated with the value of the current timer in |
| nanoseconds. |
| The resolution of the timer may be queried via <a href="#clGetPlatformInfo"><strong>clGetPlatformInfo</strong></a> and the |
| flag <a href="#CL_PLATFORM_HOST_TIMER_RESOLUTION"><code>CL_PLATFORM_<wbr>HOST_<wbr>TIMER_<wbr>RESOLUTION</code></a>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetHostTimer"><strong>clGetHostTimer</strong></a> returns the current value of the host clock as seen by |
| <em>device</em>. |
| This value is in the same timebase as the <em>host_timestamp</em> returned from |
| <a href="#clGetDeviceAndHostTimer"><strong>clGetDeviceAndHostTimer</strong></a>. |
| The implementation will return with as low a latency as possible to allow a |
| correlation with a subsequent application sampled time. |
| The host timestamp and device timestamp returned by this function and |
| <a href="#clGetDeviceAndHostTimer"><strong>clGetDeviceAndHostTimer</strong></a> each have an implementation defined timebase. |
| The timestamps will always be in their respective timebases regardless of |
| which query function is used. |
| The timestamp returned from <a href="#clGetEventProfilingInfo"><strong>clGetEventProfilingInfo</strong></a> for an event on a |
| device and a device timestamp queried from the same device will always be in |
| the same timebase.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetHostTimer"><strong>clGetHostTimer</strong></a> will return <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> with a time value in |
| <em>host_timestamp</em> if provided. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if the platform associated with <em>device</em> does not |
| support device and host timer synchronization.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>host_timestamp</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_partitioning_a_device"><a class="anchor" href="#_partitioning_a_device"></a>4.3. Partitioning a Device</h3> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Partitioning devices is <a href="#unified-spec">missing before</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To create sub-devices partitioning an OpenCL device, call the function:</p> |
| </div> |
| <div id="clCreateSubDevices" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clCreateSubDevices( |
| cl_device_id in_device, |
| <span class="directive">const</span> cl_device_partition_property* properties, |
| cl_uint num_devices, |
| cl_device_id* out_devices, |
| cl_uint* num_devices_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> is <a href="#unified-spec">missing before</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>in_device</em> is the device to be partitioned.</p> |
| </li> |
| <li> |
| <p><em>properties</em> specifies how <em>in_device</em> is to be partitioned, described by a |
| partition name and its corresponding value. |
| Each partition name is immediately followed by the corresponding desired |
| value. |
| The list is terminated with 0. |
| The list of supported partitioning schemes is described in the |
| <a href="#subdevice-partition-table">Subdevice Partition</a> table. |
| Only one of the listed partitioning schemes can be specified in |
| <em>properties</em>.</p> |
| </li> |
| <li> |
| <p><em>num_devices</em> is the size of memory pointed to by <em>out_devices</em> specified as |
| the number of <code>cl_device_<wbr>id</code> entries.</p> |
| </li> |
| <li> |
| <p><em>out_devices</em> is the buffer where the OpenCL sub-devices will be returned. |
| If <em>out_devices</em> is <code>NULL</code>, this argument is ignored. |
| If <em>out_devices</em> is not <code>NULL</code>, <em>num_devices</em> must be greater than or equal |
| to the number of sub-devices that <em>device</em> may be partitioned into according |
| to the partitioning scheme specified in <em>properties</em>.</p> |
| </li> |
| <li> |
| <p><em>num_devices_ret</em> returns the number of sub-devices that <em>device</em> may be |
| partitioned into according to the partitioning scheme specified in |
| <em>properties</em>. |
| If <em>num_devices_ret</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> creates an array of sub-devices that each reference a |
| non-intersecting set of compute units within <em>in_device</em>, according to the |
| partition scheme given by <em>properties</em>. |
| The output sub-devices may be used in every way that the root (or parent) |
| device can be used, including creating contexts, building programs, further |
| calls to <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> and creating command-queues. |
| When a command-queue is created against a sub-device, the commands enqueued |
| on the queue are executed only on the sub-device.</p> |
| </div> |
| <table id="subdevice-partition-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 6. List of supported partition schemes by <a href="#clCreateSubDevices">clCreateSubDevices</a></caption> |
| <colgroup> |
| <col style="width: 33%;"> |
| <col style="width: 17%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Partition Property</th> |
| <th class="tableblock halign-left valign-top">Partition Value</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARTITION_EQUALLY"></a><a href="#CL_DEVICE_PARTITION_EQUALLY"><code>CL_DEVICE_<wbr>PARTITION_<wbr>EQUALLY</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Split the aggregate device into as many smaller aggregate devices as |
| can be created, each containing <em>n</em> compute units. |
| The value <em>n</em> is passed as the value accompanying this property. |
| If <em>n</em> does not divide evenly into |
| <a href="#CL_DEVICE_MAX_COMPUTE_UNITS"><code>CL_DEVICE_<wbr>MAX_<wbr>COMPUTE_<wbr>UNITS</code></a>, then the remaining compute |
| units are not used.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARTITION_BY_COUNTS"></a><a href="#CL_DEVICE_PARTITION_BY_COUNTS"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>COUNTS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This property is followed by a list of compute unit counts |
| terminated with 0 or <a id="CL_DEVICE_PARTITION_BY_COUNTS_LIST_END"></a><a href="#CL_DEVICE_PARTITION_BY_COUNTS_LIST_END"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>COUNTS_<wbr>LIST_<wbr>END</code></a>. |
| For each non-zero count <em>m</em> in the list, a sub-device is created |
| with <em>m</em> compute units in it.</p> |
| <p class="tableblock"> The number of non-zero count entries in the list may not exceed |
| <a href="#CL_DEVICE_PARTITION_MAX_SUB_DEVICES"><code>CL_DEVICE_<wbr>PARTITION_<wbr>MAX_<wbr>SUB_<wbr>DEVICES</code></a>.</p> |
| <p class="tableblock"> The total number of compute units specified may not exceed |
| <a href="#CL_DEVICE_MAX_COMPUTE_UNITS"><code>CL_DEVICE_<wbr>MAX_<wbr>COMPUTE_<wbr>UNITS</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN"></a><a href="#CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>AFFINITY_<wbr>DOMAIN</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>affinity_<wbr>domain</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Split the device into smaller aggregate devices containing one or |
| more compute units that all share part of a cache hierarchy. |
| The value accompanying this property may be drawn from the following |
| list:</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_AFFINITY_DOMAIN_NUMA"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>NUMA</code></a> - Split the device into sub-devices |
| comprised of compute units that share a NUMA node.</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_AFFINITY_DOMAIN_L4_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L4_<wbr>CACHE</code></a> - Split the device into |
| sub-devices comprised of compute units that share a level 4 data |
| cache.</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_AFFINITY_DOMAIN_L3_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L3_<wbr>CACHE</code></a> - Split the device into |
| sub-devices comprised of compute units that share a level 3 data |
| cache.</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_AFFINITY_DOMAIN_L2_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L2_<wbr>CACHE</code></a> - Split the device into |
| sub-devices comprised of compute units that share a level 2 data |
| cache.</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_AFFINITY_DOMAIN_L1_CACHE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>L1_<wbr>CACHE</code></a> - Split the device into |
| sub-devices comprised of compute units that share a level 1 data |
| cache.</p> |
| <p class="tableblock"> <a href="#CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE"><code>CL_DEVICE_<wbr>AFFINITY_<wbr>DOMAIN_<wbr>NEXT_<wbr>PARTITIONABLE</code></a> - Split the device |
| along the next partitionable affinity domain. |
| The implementation shall find the first level along which the device |
| or sub-device may be further subdivided in the order NUMA, L4, L3, |
| L2, L1, and partition the device into sub-devices comprised of |
| compute units that share memory subsystems at this level.</p> |
| <p class="tableblock"> The user may determine what happened by calling |
| <a href="#clGetDeviceInfo"><strong>clGetDeviceInfo</strong></a>(<a href="#CL_DEVICE_PARTITION_TYPE"><code>CL_DEVICE_<wbr>PARTITION_<wbr>TYPE</code></a>) on the sub-devices.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the partition is created |
| successfully. |
| Otherwise, it returns a <code>NULL</code> value with the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>in_device</em> is not a valid device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>properties</em> are not valid or if |
| values specified in <em>properties</em> are valid but not supported by the |
| device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>out_devices</em> is not <code>NULL</code> and <em>num_devices</em> is |
| less than the number of sub-devices created by the partition scheme.</p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_PARTITION_FAILED"><code>CL_DEVICE_<wbr>PARTITION_<wbr>FAILED</code></a> if the partition name is supported by the |
| implementation but in_device could not be further partitioned.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE_PARTITION_COUNT"><code>CL_INVALID_<wbr>DEVICE_<wbr>PARTITION_<wbr>COUNT</code></a> if the partition name specified in |
| <em>properties</em> is <a href="#CL_DEVICE_PARTITION_BY_COUNTS"><code>CL_DEVICE_<wbr>PARTITION_<wbr>BY_<wbr>COUNTS</code></a> and the number of |
| sub-devices requested exceeds <a href="#CL_DEVICE_PARTITION_MAX_SUB_DEVICES"><code>CL_DEVICE_<wbr>PARTITION_<wbr>MAX_<wbr>SUB_<wbr>DEVICES</code></a> or the |
| total number of compute units requested exceeds |
| <a href="#CL_DEVICE_MAX_COMPUTE_UNITS"><code>CL_DEVICE_<wbr>MAX_<wbr>COMPUTE_<wbr>UNITS</code></a> for <em>in_device</em>, or the number of |
| compute units requested for one or more sub-devices is less than zero or |
| the number of sub-devices requested exceeds |
| <a href="#CL_DEVICE_MAX_COMPUTE_UNITS"><code>CL_DEVICE_<wbr>MAX_<wbr>COMPUTE_<wbr>UNITS</code></a> for <em>in_device</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>A few examples that describe how to specify partition properties in |
| <em>properties</em> argument to <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> are given below:</p> |
| </div> |
| <div class="paragraph"> |
| <p>To partition a device containing 16 compute units into two sub-devices, each |
| containing 8 compute units, pass the following in <em>properties</em>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c">{ CL_DEVICE_PARTITION_EQUALLY, <span class="integer">8</span>, |
| <span class="integer">0</span> } <span class="comment">// 0 terminates the property list</span></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>To partition a device with four compute units into two sub-devices with one |
| sub-device containing 3 compute units and the other sub-device 1 compute |
| unit, pass the following in properties argument:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c">{ CL_DEVICE_PARTITION_BY_COUNTS, |
| <span class="integer">3</span>, <span class="integer">1</span>, CL_DEVICE_PARTITION_BY_COUNTS_LIST_END, |
| <span class="integer">0</span> } <span class="comment">// 0 terminates the property list</span></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>To split a device along the outermost cache line (if any), pass the |
| following in properties argument:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c">{ CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN, |
| CL_DEVICE_AFFINITY_DOMAIN_NEXT_PARTITIONABLE, |
| <span class="integer">0</span> } <span class="comment">// 0 terminates the property list</span></code></pre> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To retain a device, call the function:</p> |
| </div> |
| <div id="clRetainDevice" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clRetainDevice( |
| cl_device_id device);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clRetainDevice"><strong>clRetainDevice</strong></a> is <a href="#unified-spec">missing before</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>device</em> is the OpenCL device to retain.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clRetainDevice"><strong>clRetainDevice</strong></a> increments the <em>device</em> reference count if <em>device</em> is a |
| valid sub-device created by a call to <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a>. |
| If <em>device</em> is a root level device i.e. a <code>cl_device_<wbr>id</code> returned by |
| <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a>, the <em>device</em> reference count remains unchanged.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clRetainDevice"><strong>clRetainDevice</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed successfully |
| or the device is a root-level device. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To release a device, call the function:</p> |
| </div> |
| <div id="clReleaseDevice" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clReleaseDevice( |
| cl_device_id device);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clReleaseDevice"><strong>clReleaseDevice</strong></a> is <a href="#unified-spec">missing before</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>device</em> is the OpenCL device to retain.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clReleaseDevice"><strong>clReleaseDevice</strong></a> decrements the <em>device</em> reference count if device is a |
| valid sub-device created by a call to <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a>. |
| If <em>device</em> is a root level device i.e. a <code>cl_device_<wbr>id</code> returned by |
| <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a>, the <em>device</em> reference count remains unchanged.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clReleaseDevice"><strong>clReleaseDevice</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>After the <em>device</em> reference count becomes zero and all the objects attached |
| to <em>device</em> (such as command-queues) are released, the <em>device</em> object is |
| deleted. |
| Using this function to release a reference that was not obtained by creating |
| the object or by calling <a href="#clRetainDevice"><strong>clRetainDevice</strong></a> causes undefined behavior.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_contexts"><a class="anchor" href="#_contexts"></a>4.4. Contexts</h3> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To create an OpenCL context, call the function:</p> |
| </div> |
| <div id="clCreateContext" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_context clCreateContext( |
| <span class="directive">const</span> cl_context_properties* properties, |
| cl_uint num_devices, |
| <span class="directive">const</span> cl_device_id* devices, |
| <span class="directive">void</span> (CL_CALLBACK* pfn_notify)(<span class="directive">const</span> <span class="predefined-type">char</span>* errinfo, <span class="directive">const</span> <span class="directive">void</span>* private_info, size_t cb, <span class="directive">void</span>* user_data), |
| <span class="directive">void</span>* user_data, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>properties</em> specifies a list of context property names and their |
| corresponding values. |
| Each property name is immediately followed by the corresponding desired |
| value. |
| The list is terminated with 0. |
| The list of supported properties is described in the |
| <a href="#context-properties-table">Context Properties</a> table. |
| <em>properties</em> can be <code>NULL</code> in which case the platform that is selected is |
| implementation-defined.</p> |
| </li> |
| <li> |
| <p><em>num_devices</em> is the number of devices specified in the <em>devices</em> argument.</p> |
| </li> |
| <li> |
| <p><em>devices</em> is a pointer to a list of unique devices returned by |
| <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a> or sub-devices created by <a href="#clCreateSubDevices"><strong>clCreateSubDevices</strong></a> for a |
| platform. <sup class="footnote">[<a id="_footnoteref_11" class="footnote" href="#_footnotedef_11" title="View footnote.">11</a>]</sup></p> |
| </li> |
| <li> |
| <p><em>pfn_notify</em> is a callback function that can be registered by the |
| application. |
| This callback function will be used by the OpenCL implementation to report |
| information on errors during context creation as well as errors that occur |
| at runtime in this context. |
| This callback function may be called asynchronously by the OpenCL |
| implementation. |
| It is the applications responsibility to ensure that the callback function |
| is thread-safe. |
| If <em>pfn_notify</em> is <code>NULL</code>, no callback function is registered.</p> |
| </li> |
| <li> |
| <p><em>user_data</em> will be passed as the <em>user_data</em> argument when <em>pfn_notify</em> is |
| called. |
| <em>user_data</em> can be <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The parameters to the callback function <em>pfn_notify</em> are:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>errinfo</em> is a pointer to an error string.</p> |
| </li> |
| <li> |
| <p><em>private_info</em> and <em>cb</em> represent a pointer to binary data that is |
| returned by the OpenCL implementation that can be used to log additional |
| information helpful in debugging the error.</p> |
| </li> |
| <li> |
| <p><em>user_data</em> is a pointer to user supplied data.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Contexts are used by the OpenCL runtime for managing objects such as |
| command-queues, memory, program and kernel objects and for executing kernels |
| on one or more devices specified in the context.</p> |
| </div> |
| <table id="context-properties-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 7. List of supported context creation properties by <a href="#clCreateContext">clCreateContext</a></caption> |
| <colgroup> |
| <col style="width: 33%;"> |
| <col style="width: 17%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Context Property</th> |
| <th class="tableblock halign-left valign-top">Property Value</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_CONTEXT_PLATFORM"></a><a href="#CL_CONTEXT_PLATFORM"><code>CL_CONTEXT_<wbr>PLATFORM</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_platform_<wbr>id</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the platform to use.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_CONTEXT_INTEROP_USER_SYNC"></a><a href="#CL_CONTEXT_INTEROP_USER_SYNC"><code>CL_CONTEXT_<wbr>INTEROP_<wbr>USER_<wbr>SYNC</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_bool</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Specifies whether the user is responsible for synchronization |
| between OpenCL and other APIs. |
| Please refer to the specific sections in the OpenCL Extension |
| Specification that describe sharing with other APIs for restrictions |
| on using this flag.</p> |
| <p class="tableblock"> If <a href="#CL_CONTEXT_INTEROP_USER_SYNC"><code>CL_CONTEXT_<wbr>INTEROP_<wbr>USER_<wbr>SYNC</code></a> is not specified, a default of |
| <a href="#CL_FALSE"><code>CL_FALSE</code></a> is assumed.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| There are a number of cases where error notifications need to be |
| delivered due to an error that occurs outside a context. |
| Such notifications may not be delivered through the <em>pfn_notify</em> callback. |
| Where these notifications go is implementation-defined. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateContext"><strong>clCreateContext</strong></a> returns a valid non-zero context and <em>errcode_ret</em> is set |
| to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the context is created successfully. |
| Otherwise, it returns a <code>NULL</code> value with the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_PLATFORM"><code>CL_INVALID_<wbr>PLATFORM</code></a> if <em>properties</em> is <code>NULL</code> and no platform could be |
| selected or if platform value specified in <em>properties</em> is not a valid |
| platform.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_PROPERTY"><code>CL_INVALID_<wbr>PROPERTY</code></a> if context property name in <em>properties</em> is not a |
| supported property name, if the value specified for a supported property |
| name is not valid, or if the same property name is specified more than |
| once. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>devices</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>num_devices</em> is equal to zero.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>pfn_notify</em> is <code>NULL</code> but <em>user_data</em> is not |
| <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if any device in <em>devices</em> is not a valid device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_NOT_AVAILABLE"><code>CL_DEVICE_<wbr>NOT_<wbr>AVAILABLE</code></a> if a device in <em>devices</em> is currently not |
| available even though the device was returned by <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="paragraph"> |
| <p>It is possible that a device(s) becomes unavailable after a context and |
| command-queues that use this device(s) have been created and commands have |
| been queued to command-queues. |
| In this case the behavior of OpenCL API calls that use this context (and |
| command-queues) are considered to be implementation-defined. |
| The user callback function, if specified, when the context is created can be |
| used to record appropriate information in the <em>errinfo</em>, <em>private_info</em> |
| arguments passed to the callback function when the device becomes |
| unavailable.</p> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To create an OpenCL context from a specific device |
| type <sup class="footnote">[<a id="_footnoteref_12" class="footnote" href="#_footnotedef_12" title="View footnote.">12</a>]</sup>, call the function:</p> |
| </div> |
| <div id="clCreateContextFromType" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_context clCreateContextFromType( |
| <span class="directive">const</span> cl_context_properties* properties, |
| cl_device_type device_type, |
| <span class="directive">void</span> (CL_CALLBACK* pfn_notify)(<span class="directive">const</span> <span class="predefined-type">char</span>* errinfo, <span class="directive">const</span> <span class="directive">void</span>* private_info, size_t cb, <span class="directive">void</span>* user_data), |
| <span class="directive">void</span>* user_data, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>properties</em> specifies a list of context property names and their |
| corresponding values. |
| Each property name is immediately followed by the corresponding desired |
| value. |
| The list of supported properties is described in the |
| <a href="#context-properties-table">Context Properties</a> table. |
| <em>properties</em> can also be <code>NULL</code> in which case the platform that is selected |
| is implementation-defined.</p> |
| </li> |
| <li> |
| <p><em>device_type</em> is a bit-field that identifies the type of device and is |
| described in the <a href="#device-types-table">Device Types</a> table.</p> |
| </li> |
| <li> |
| <p><em>pfn_notify</em> and <em>user_data</em> are described in <a href="#clCreateContext"><strong>clCreateContext</strong></a>.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Only devices that are returned by <a href="#clGetDeviceIDs"><strong>clGetDeviceIDs</strong></a> for <em>device_type</em> are |
| used to create the context. |
| The context does not reference any sub-devices that may have been created |
| from these devices.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateContextFromType"><strong>clCreateContextFromType</strong></a> returns a valid non-zero context and <em>errcode_ret</em> |
| is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the context is created successfully. |
| Otherwise, it returns a <code>NULL</code> value with the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_PLATFORM"><code>CL_INVALID_<wbr>PLATFORM</code></a> if <em>properties</em> is <code>NULL</code> and no platform could be |
| selected or if platform value specified in <em>properties</em> is not a valid |
| platform.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_PROPERTY"><code>CL_INVALID_<wbr>PROPERTY</code></a> if context property name in <em>properties</em> is not a |
| supported property name, if the value specified for a supported property |
| name is not valid, or if the same property name is specified more than |
| once. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>pfn_notify</em> is <code>NULL</code> but <em>user_data</em> is not |
| <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE_TYPE"><code>CL_INVALID_<wbr>DEVICE_<wbr>TYPE</code></a> if <em>device_type</em> is not a valid value.</p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_NOT_AVAILABLE"><code>CL_DEVICE_<wbr>NOT_<wbr>AVAILABLE</code></a> if no devices that match <em>device_type</em> and |
| property values specified in <em>properties</em> are currently available.</p> |
| </li> |
| <li> |
| <p><a href="#CL_DEVICE_NOT_FOUND"><code>CL_DEVICE_<wbr>NOT_<wbr>FOUND</code></a> if no devices that match <em>device_type</em> and property |
| values specified in <em>properties</em> were found.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To retain a context, call the function:</p> |
| </div> |
| <div id="clRetainContext" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clRetainContext( |
| cl_context context);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> specifies the OpenCL context to retain.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clRetainContext"><strong>clRetainContext</strong></a> increments the <em>context</em> reference count.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateContext"><strong>clCreateContext</strong></a> and <a href="#clCreateContextFromType"><strong>clCreateContextFromType</strong></a> perform an implicit retain. |
| This is very helpful for 3<sup>rd</sup> party libraries, which typically get a |
| context passed to them by the application. |
| However, it is possible that the application may delete the context without |
| informing the library. |
| Allowing functions to attach to (i.e. retain) and release a context solves |
| the problem of a context being used by a library no longer being valid.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clRetainContext"><strong>clRetainContext</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid OpenCL context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To release a context, call the function:</p> |
| </div> |
| <div id="clReleaseContext" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clReleaseContext( |
| cl_context context);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> specifies the OpenCL context to release.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clReleaseContext"><strong>clReleaseContext</strong></a> decrements the <em>context</em> reference count. |
| After the reference count becomes zero and all the objects attached to |
| <em>context</em> (such as memory objects, command-queues) are released, the |
| <em>context</em> is deleted. |
| Using this function to release a reference that was not obtained by creating |
| the object or by calling <a href="#clRetainContext"><strong>clRetainContext</strong></a> causes undefined behavior.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clReleaseContext"><strong>clReleaseContext</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid OpenCL context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To query information about a context, call the function:</p> |
| </div> |
| <div id="clGetContextInfo" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetContextInfo( |
| cl_context context, |
| cl_context_info param_name, |
| size_t param_value_size, |
| <span class="directive">void</span>* param_value, |
| size_t* param_value_size_ret);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> specifies the OpenCL context being queried.</p> |
| </li> |
| <li> |
| <p><em>param_name</em> is an enumeration constant that specifies the information to |
| query.</p> |
| </li> |
| <li> |
| <p><em>param_value</em> is a pointer to memory where the appropriate result being |
| queried is returned. |
| If <em>param_value</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| <li> |
| <p><em>param_value_size</em> specifies the size in bytes of memory pointed to by |
| <em>param_value</em>. |
| This size must be greater than or equal to the size of return type as |
| described in the <a href="#context-info-table">Context Attributes</a> table.</p> |
| </li> |
| <li> |
| <p><em>param_value_size_ret</em> returns the actual size in bytes of data being |
| queried by <em>param_name</em>. |
| If <em>param_value_size_ret</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The list of supported <em>param_name</em> values and the information returned in |
| <em>param_value</em> by <a href="#clGetContextInfo"><strong>clGetContextInfo</strong></a> is described in the |
| <a href="#context-info-table">Context Attributes</a> table.</p> |
| </div> |
| <table id="context-info-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 8. List of supported param_names by <a href="#clGetContextInfo">clGetContextInfo</a></caption> |
| <colgroup> |
| <col style="width: 33%;"> |
| <col style="width: 17%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Context Info</th> |
| <th class="tableblock halign-left valign-top">Return Type</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_CONTEXT_REFERENCE_COUNT"></a><a href="#CL_CONTEXT_REFERENCE_COUNT"><code>CL_CONTEXT_<wbr>REFERENCE_<wbr>COUNT</code></a> <sup class="footnote">[<a id="_footnoteref_13" class="footnote" href="#_footnotedef_13" title="View footnote.">13</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the <em>context</em> reference count.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_CONTEXT_NUM_DEVICES"></a><a href="#CL_CONTEXT_NUM_DEVICES"><code>CL_CONTEXT_<wbr>NUM_<wbr>DEVICES</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the number of devices in <em>context</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_CONTEXT_DEVICES"></a><a href="#CL_CONTEXT_DEVICES"><code>CL_CONTEXT_<wbr>DEVICES</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>id</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the list of devices and sub-devices in <em>context</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_CONTEXT_PROPERTIES"></a><a href="#CL_CONTEXT_PROPERTIES"><code>CL_CONTEXT_<wbr>PROPERTIES</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_context_<wbr>properties</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the properties argument specified in <a href="#clCreateContext"><strong>clCreateContext</strong></a> or |
| <a href="#clCreateContextFromType"><strong>clCreateContextFromType</strong></a>.</p> |
| <p class="tableblock"> If the <em>properties</em> argument specified in <a href="#clCreateContext"><strong>clCreateContext</strong></a> or |
| <a href="#clCreateContextFromType"><strong>clCreateContextFromType</strong></a> used to create <em>context</em> was not <code>NULL</code>, |
| the implementation must return the values specified in the |
| properties argument in the same order and without including |
| additional properties.</p> |
| <p class="tableblock"> If the <em>properties</em> argument specified in <a href="#clCreateContext"><strong>clCreateContext</strong></a> or |
| <a href="#clCreateContextFromType"><strong>clCreateContextFromType</strong></a> used to create <em>context</em> was <code>NULL</code>, the |
| implementation must return <em>param_value_size_ret</em> equal to 0, |
| indicating that there are no properties to be returned.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><a href="#clGetContextInfo"><strong>clGetContextInfo</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>param_name</em> is not one of the supported values or |
| if size in bytes specified by <em>param_value_size</em> is < size of return |
| type as specified in the <a href="#context-info-table">Context Attributes</a> |
| table and <em>param_value</em> is not a <code>NULL</code> value.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To register a callback function with a context that is called when |
| the context is destroyed, call the function</p> |
| </div> |
| <div id="clSetContextDestructorCallback" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clSetContextDestructorCallback( |
| cl_context context, |
| <span class="directive">void</span> (CL_CALLBACK* pfn_notify)(cl_context context, <span class="directive">void</span>* user_data), |
| <span class="directive">void</span>* user_data);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clSetContextDestructorCallback"><strong>clSetContextDestructorCallback</strong></a> is <a href="#unified-spec">missing before</a> version 3.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> specifies the OpenCL context to register the callback to.</p> |
| </li> |
| <li> |
| <p><em>pfn_notify</em> is the callback function to register. |
| This callback function may be called asynchronously by the OpenCL |
| implementation. |
| It is the application’s responsibility to ensure that the callback function |
| is thread-safe. |
| The parameters to this callback function are:</p> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> is the OpenCL context being deleted. |
| When the callback function is called by the implementation, this context |
| is no longer valid. |
| <em>context</em> is only provided for reference purposes.</p> |
| </li> |
| <li> |
| <p><em>user_data</em> is a pointer to user-supplied data.</p> |
| </li> |
| </ul> |
| </div> |
| </li> |
| <li> |
| <p><em>user_data</em> will be passed as the <em>user_data</em> argument when <em>pfn_notify</em> is |
| called. |
| <em>user_data</em> can be <code>NULL</code>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Each call to <a href="#clSetContextDestructorCallback"><strong>clSetContextDestructorCallback</strong></a> registers the specified |
| callback function on a destructor callback stack associated with <em>context</em>. |
| The registered callback functions are called in the reverse order in |
| which they were registered. |
| If a context callback function was specified when <em>context</em> was created, |
| it will not be called after any context destructor callback is called. |
| Therefore, the context destructor callback provides a mechanism for an |
| application to safely re-use or free any <em>user_data</em> specified for the |
| context callback function when <em>context</em> was created.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clSetContextDestructorCallback"><strong>clSetContextDestructorCallback</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is |
| executed successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>pfn_notify</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="opencl-runtime"><a class="anchor" href="#opencl-runtime"></a>5. The OpenCL Runtime</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>In this section we describe the API calls that manage OpenCL objects such as |
| command-queues, memory objects, program objects, kernel objects for kernel |
| functions in a program and calls that allow you to enqueue commands to a |
| command-queue such as executing a kernel, reading, or writing a memory |
| object.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_command_queues"><a class="anchor" href="#_command_queues"></a>5.1. Command Queues</h3> |
| <div class="paragraph"> |
| <p>OpenCL objects such as memory, program and kernel objects are created using |
| a context. |
| Operations on these objects are performed using a command-queue. |
| The command-queue can be used to queue a set of operations (referred to as |
| commands) in order. |
| Having multiple command-queues allows applications to queue multiple |
| independent commands without requiring synchronization. |
| Note that this should work as long as these objects are not being shared. |
| Sharing of objects across multiple command-queues will require the |
| application to perform appropriate synchronization. |
| This is described in <a href="#shared-opencl-objects">Shared OpenCL Objects</a></p> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To create a host or device command-queue on a specific device, call the |
| function</p> |
| </div> |
| <div id="clCreateCommandQueueWithProperties" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_command_queue clCreateCommandQueueWithProperties( |
| cl_context context, |
| cl_device_id device, |
| <span class="directive">const</span> cl_queue_properties* properties, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateCommandQueueWithProperties"><strong>clCreateCommandQueueWithProperties</strong></a> is <a href="#unified-spec">missing before</a> version 2.0. |
| Also see extension <strong>cl_khr_create_command_queue</strong>. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> must be a valid OpenCL context.</p> |
| </li> |
| <li> |
| <p><em>device</em> must be a device or sub-device associated with <em>context</em>. |
| It can either be in the list of devices and sub-devices specified when |
| <em>context</em> is created using <a href="#clCreateContext"><strong>clCreateContext</strong></a> or be a root device with the |
| same device type as specified when <em>context</em> is created using |
| <a href="#clCreateContextFromType"><strong>clCreateContextFromType</strong></a>.</p> |
| </li> |
| <li> |
| <p><em>properties</em> specifies a list of properties for the command-queue and their |
| corresponding values. |
| Each property name is immediately followed by the corresponding desired |
| value. |
| The list is terminated with 0. |
| The list of supported properties is described in the |
| <a href="#queue-properties-table">table below</a>. |
| If a supported property and its value is not specified in <em>properties</em>, its |
| default value will be used. |
| <em>properties</em> can be <code>NULL</code> in which case the default values for supported |
| command-queue properties will be used.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="queue-properties-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 9. List of supported queue creation properties by <a href="#clCreateCommandQueueWithProperties">clCreateCommandQueueWithProperties</a></caption> |
| <colgroup> |
| <col style="width: 33%;"> |
| <col style="width: 17%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Queue Property</th> |
| <th class="tableblock halign-left valign-top">Property Value</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_PROPERTIES"></a><a href="#CL_QUEUE_PROPERTIES"><code>CL_QUEUE_<wbr>PROPERTIES</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_command_<wbr>queue_<wbr>properties</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This is a bitfield and can be set to a combination of the following |
| values:</p> |
| <p class="tableblock"> <a id="CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"></a><a href="#CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"><code>CL_QUEUE_<wbr>OUT_<wbr>OF_<wbr>ORDER_<wbr>EXEC_<wbr>MODE_<wbr>ENABLE</code></a> - Determines whether the |
| commands queued in the command-queue are executed in-order or |
| out-of-order. |
| If set, the commands in the command-queue are executed out-of-order. |
| Otherwise, commands are executed in-order.</p> |
| <p class="tableblock"> <a id="CL_QUEUE_PROFILING_ENABLE"></a><a href="#CL_QUEUE_PROFILING_ENABLE"><code>CL_QUEUE_<wbr>PROFILING_<wbr>ENABLE</code></a> - Enable or disable profiling of commands |
| in the command-queue. |
| If set, the profiling of commands is enabled. |
| Otherwise profiling of commands is disabled.</p> |
| <p class="tableblock"> <a id="CL_QUEUE_ON_DEVICE"></a><a href="#CL_QUEUE_ON_DEVICE"><code>CL_QUEUE_<wbr>ON_<wbr>DEVICE</code></a> - Indicates that this is a device queue. |
| If <a href="#CL_QUEUE_ON_DEVICE"><code>CL_QUEUE_<wbr>ON_<wbr>DEVICE</code></a> is set, |
| <a href="#CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"><code>CL_QUEUE_<wbr>OUT_<wbr>OF_<wbr>ORDER_<wbr>EXEC_<wbr>MODE_<wbr>ENABLE</code></a> |
| <sup class="footnote">[<a id="_footnoteref_14" class="footnote" href="#_footnotedef_14" title="View footnote.">14</a>]</sup> |
| must also be set. |
| <a href="#unified-spec">Missing before</a> version 2.0.</p> |
| <p class="tableblock"> <a id="CL_QUEUE_ON_DEVICE_DEFAULT"></a><a href="#CL_QUEUE_ON_DEVICE_DEFAULT"><code>CL_QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>DEFAULT</code></a> |
| <sup class="footnote">[<a id="_footnoteref_15" class="footnote" href="#_footnotedef_15" title="View footnote.">15</a>]</sup> - |
| indicates that this is the default device queue. |
| This can only be used with <a href="#CL_QUEUE_ON_DEVICE"><code>CL_QUEUE_<wbr>ON_<wbr>DEVICE</code></a>. |
| <a href="#unified-spec">Missing before</a> version 2.0.</p> |
| <p class="tableblock"> If <a href="#CL_QUEUE_PROPERTIES"><code>CL_QUEUE_<wbr>PROPERTIES</code></a> is not specified an in-order host command |
| queue is created for the specified device</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_SIZE"></a><a href="#CL_QUEUE_SIZE"><code>CL_QUEUE_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Specifies the size of the device queue in bytes.</p> |
| <p class="tableblock"> This can only be specified if <a href="#CL_QUEUE_ON_DEVICE"><code>CL_QUEUE_<wbr>ON_<wbr>DEVICE</code></a> is set in |
| <a href="#CL_QUEUE_PROPERTIES"><code>CL_QUEUE_<wbr>PROPERTIES</code></a>. |
| This must be a value ≤ <a href="#CL_DEVICE_QUEUE_ON_DEVICE_MAX_SIZE"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>MAX_<wbr>SIZE</code></a>.</p> |
| <p class="tableblock"> For best performance, this should be ≤ |
| <a href="#CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>PREFERRED_<wbr>SIZE</code></a>.</p> |
| <p class="tableblock"> If <a href="#CL_QUEUE_SIZE"><code>CL_QUEUE_<wbr>SIZE</code></a> is not specified, the device queue is created with |
| <a href="#CL_DEVICE_QUEUE_ON_DEVICE_PREFERRED_SIZE"><code>CL_DEVICE_<wbr>QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>PREFERRED_<wbr>SIZE</code></a> as the size of the queue.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><a href="#clCreateCommandQueueWithProperties"><strong>clCreateCommandQueueWithProperties</strong></a> returns a valid non-zero command-queue |
| and <em>errcode_ret</em> is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the command-queue is created |
| successfully. |
| Otherwise, it returns a <code>NULL</code> value with one of the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device or is not associated |
| with <em>context</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>properties</em> are not valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_QUEUE_PROPERTIES"><code>CL_INVALID_<wbr>QUEUE_<wbr>PROPERTIES</code></a> if values specified in <em>properties</em> are |
| valid but are not supported by the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To create a host command-queue on a specific device, call the function</p> |
| </div> |
| <div id="clCreateCommandQueue" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_command_queue clCreateCommandQueue( |
| cl_context context, |
| cl_device_id device, |
| cl_command_queue_properties properties, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateCommandQueue"><strong>clCreateCommandQueue</strong></a> is <a href="#unified-spec">deprecated by</a> version 2.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> must be a valid OpenCL context.</p> |
| </li> |
| <li> |
| <p><em>device</em> must be a device or sub-device associated with <em>context</em>. |
| It can either be in the list of devices and sub-devices specified when |
| <em>context</em> is created using <a href="#clCreateContext"><strong>clCreateContext</strong></a> or be a root device with the |
| same device type as specified when <em>context</em> is created using |
| <a href="#clCreateContextFromType"><strong>clCreateContextFromType</strong></a>.</p> |
| </li> |
| <li> |
| <p><em>properties</em> specifies a list of properties for the command-queue. |
| This is a bit-field and the supported properties are described in the |
| <a href="#legacy-queue-properties-table">table</a> below. |
| Only command-queue properties specified in this table can be used, |
| otherwise the value specified in <em>properties</em> is considered to be not |
| valid. |
| <em>properties</em> can be 0 in which case the default values for supported |
| command-queue properties will be used.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="legacy-queue-properties-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 10. List of supported <code>cl_command_queue_property</code> values by <a href="#clCreateCommandQueue">clCreateCommandQueue</a></caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Command-Queue Properties</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"><code>CL_QUEUE_<wbr>OUT_<wbr>OF_<wbr>ORDER_<wbr>EXEC_<wbr>MODE_<wbr>ENABLE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Determines whether the commands queued in the command-queue are executed |
| in-order or out-of-order. |
| If set, the commands in the command-queue are executed out-of-order. |
| Otherwise, commands are executed in-order.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_QUEUE_PROFILING_ENABLE"><code>CL_QUEUE_<wbr>PROFILING_<wbr>ENABLE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Enable or disable profiling of commands in the command-queue. |
| If set, the profiling of commands is enabled. |
| Otherwise profiling of commands is disabled.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateCommandQueue"><strong>clCreateCommandQueue</strong></a> returns a valid non-zero command-queue and <em>errcode_ret</em> |
| is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the command-queue is created successfully. |
| Otherwise, it returns a <code>NULL</code> value with one of the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device or is not associated |
| with <em>context</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>properties</em> are not valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_QUEUE_PROPERTIES"><code>CL_INVALID_<wbr>QUEUE_<wbr>PROPERTIES</code></a> if values specified in <em>properties</em> are |
| valid but are not supported by the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To replace the default command queue on a device, call the function</p> |
| </div> |
| <div id="clSetDefaultDeviceCommandQueue" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clSetDefaultDeviceCommandQueue( |
| cl_context context, |
| cl_device_id device, |
| cl_command_queue command_queue);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clSetDefaultDeviceCommandQueue"><strong>clSetDefaultDeviceCommandQueue</strong></a> is <a href="#unified-spec">missing before</a> version 2.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> is the OpenCL context used to create <em>command_queue</em>.</p> |
| </li> |
| <li> |
| <p><em>device</em> is a valid OpenCL device associated with <em>context</em>.</p> |
| </li> |
| <li> |
| <p><em>command_queue</em> specifies a command queue object which replaces the |
| default device command queue</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clSetDefaultDeviceCommandQueue"><strong>clSetDefaultDeviceCommandQueue</strong></a> may be used to replace a default device |
| command queue created with <a href="#clCreateCommandQueueWithProperties"><strong>clCreateCommandQueueWithProperties</strong></a> and the |
| <a href="#CL_QUEUE_ON_DEVICE_DEFAULT"><code>CL_QUEUE_<wbr>ON_<wbr>DEVICE_<wbr>DEFAULT</code></a> flag.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clSetDefaultDeviceCommandQueue"><strong>clSetDefaultDeviceCommandQueue</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is |
| executed successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_DEVICE"><code>CL_INVALID_<wbr>DEVICE</code></a> if <em>device</em> is not a valid device or is not associated |
| with <em>context</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <em>device</em> does not support a replaceable default on-device queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid command-queue |
| for <em>device</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To retain a command queue, call the function</p> |
| </div> |
| <div id="clRetainCommandQueue" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clRetainCommandQueue( |
| cl_command_queue command_queue);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> specifies the command-queue to be retained.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The <em>command_queue</em> reference count is incremented.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateCommandQueueWithProperties"><strong>clCreateCommandQueueWithProperties</strong></a> and <a href="#clCreateCommandQueue"><strong>clCreateCommandQueue</strong></a> perform an |
| implicit retain. |
| This is very helpful for 3<sup>rd</sup> party libraries, which typically get a |
| command-queue passed to them by the application. |
| However, it is possible that the application may delete the command-queue |
| without informing the library. |
| Allowing functions to attach to (i.e. retain) and release a command-queue |
| solves the problem of a command-queue being used by a library no longer |
| being valid.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clRetainCommandQueue"><strong>clRetainCommandQueue</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To release a command queue, call the function</p> |
| </div> |
| <div id="clReleaseCommandQueue" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clReleaseCommandQueue( |
| cl_command_queue command_queue);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> specifies the command-queue to be released.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The <em>command_queue</em> reference count is decremented.</p> |
| </div> |
| <div class="paragraph"> |
| <p>After the <em>command_queue</em> reference count becomes zero and all commands |
| queued to <em>command_queue</em> have finished (eg. |
| kernel-instances, memory object updates etc.), the command-queue is deleted.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clReleaseCommandQueue"><strong>clReleaseCommandQueue</strong></a> performs an implicit flush to issue any previously |
| queued OpenCL commands in <em>command_queue</em>. |
| Using this function to release a reference that was not obtained by creating |
| the object or by calling <a href="#clRetainCommandQueue"><strong>clRetainCommandQueue</strong></a> causes undefined behavior.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clReleaseCommandQueue"><strong>clReleaseCommandQueue</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To query information about a command-queue, call the function</p> |
| </div> |
| <div id="clGetCommandQueueInfo" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetCommandQueueInfo( |
| cl_command_queue command_queue, |
| cl_command_queue_info param_name, |
| size_t param_value_size, |
| <span class="directive">void</span>* param_value, |
| size_t* param_value_size_ret);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> specifies the command-queue being queried.</p> |
| </li> |
| <li> |
| <p><em>param_name</em> specifies the information to query.</p> |
| </li> |
| <li> |
| <p><em>param_value</em> is a pointer to memory where the appropriate result being |
| queried is returned. |
| If <em>param_value</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| <li> |
| <p><em>param_value_size</em> is used to specify the size in bytes of memory pointed to |
| by <em>param_value</em>. |
| This size must be ≥ size of return type as described in the |
| <a href="#command-queue-param-table">Command Queue Parameter</a> table. |
| If <em>param_value</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| <li> |
| <p><em>param_value_size_ret</em> returns the actual size in bytes of data being |
| queried by <em>param_name</em>. |
| If <em>param_value_size_ret</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The list of supported <em>param_name</em> values and the information returned in |
| <em>param_value</em> by <a href="#clGetCommandQueueInfo"><strong>clGetCommandQueueInfo</strong></a> is described in the |
| <a href="#command-queue-param-table">Command Queue Parameter</a> table.</p> |
| </div> |
| <table id="command-queue-param-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 11. List of supported param_names by <a href="#clGetCommandQueueInfo">clGetCommandQueueInfo</a></caption> |
| <colgroup> |
| <col style="width: 33%;"> |
| <col style="width: 17%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Queue Info</th> |
| <th class="tableblock halign-left valign-top">Return Type</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_CONTEXT"></a><a href="#CL_QUEUE_CONTEXT"><code>CL_QUEUE_<wbr>CONTEXT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_context</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the context specified when the command-queue is created.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_DEVICE"></a><a href="#CL_QUEUE_DEVICE"><code>CL_QUEUE_<wbr>DEVICE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_device_<wbr>id</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the device specified when the command-queue is created.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_REFERENCE_COUNT"></a><a href="#CL_QUEUE_REFERENCE_COUNT"><code>CL_QUEUE_<wbr>REFERENCE_<wbr>COUNT</code></a> <sup class="footnote">[<a id="_footnoteref_16" class="footnote" href="#_footnotedef_16" title="View footnote.">16</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the command-queue reference count.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_PROPERTIES"></a><a href="#CL_QUEUE_PROPERTIES"><code>CL_QUEUE_<wbr>PROPERTIES</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_command_<wbr>queue_<wbr>properties</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the currently specified properties for the command-queue. |
| These properties are specified by the value associated with the |
| <a href="#CL_QUEUE_PROPERTIES"><code>CL_QUEUE_<wbr>PROPERTIES</code></a> passed in <em>properties</em> argument in |
| <a href="#clCreateCommandQueueWithProperties"><strong>clCreateCommandQueueWithProperties</strong></a>, or the value of the <em>properties</em> |
| argument in <a href="#clCreateCommandQueue"><strong>clCreateCommandQueue</strong></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_PROPERTIES_ARRAY"></a><a href="#CL_QUEUE_PROPERTIES_ARRAY"><code>CL_QUEUE_<wbr>PROPERTIES_<wbr>ARRAY</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 3.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_queue_<wbr>properties</code>[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the properties argument specified in |
| <a href="#clCreateCommandQueueWithProperties"><strong>clCreateCommandQueueWithProperties</strong></a>.</p> |
| <p class="tableblock"> If the <em>properties</em> argument specified in |
| <a href="#clCreateCommandQueueWithProperties"><strong>clCreateCommandQueueWithProperties</strong></a> used to create <em>command_queue</em> |
| was not <code>NULL</code>, the implementation must return the values specified in |
| the properties argument in the same order and without including |
| additional properties.</p> |
| <p class="tableblock"> If <em>command_queue</em> was created using <a href="#clCreateCommandQueue"><strong>clCreateCommandQueue</strong></a>, or if the |
| <em>properties</em> argument specified in clCreateCommandQueueWithProperties} |
| was <code>NULL</code>, the implementation must return <em>param_value_size_ret</em> |
| equal to 0, indicating that there are no properties to be returned.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_SIZE"></a><a href="#CL_QUEUE_SIZE"><code>CL_QUEUE_<wbr>SIZE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_uint</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the size of the device command-queue. |
| To be considered valid for this query, <em>command_queue</em> must be a |
| device command-queue.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_QUEUE_DEVICE_DEFAULT"></a><a href="#CL_QUEUE_DEVICE_DEFAULT"><code>CL_QUEUE_<wbr>DEVICE_<wbr>DEFAULT</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>cl_command_<wbr>queue</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the current default command queue for the underlying device.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><a href="#clGetCommandQueueInfo"><strong>clGetCommandQueueInfo</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid |
| command-queue, or if <em>command_queue</em> is not a valid command-queue |
| for <em>param_name</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>param_name</em> is not one of the supported values or |
| if size in bytes specified by <em>param_value_size</em> is < size of return |
| type as specified in the <a href="#command-queue-param-table">Command Queue |
| Parameter</a> table, and <em>param_value</em> is not a <code>NULL</code> value.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To enable or disable the properties of a command-queue, call the function</p> |
| </div> |
| <div id="clSetCommandQueueProperty" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clSetCommandQueueProperty( |
| cl_command_queue command_queue, |
| cl_command_queue_properties properties, |
| cl_bool enable, |
| cl_command_queue_properties* old_properties);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clSetCommandQueueProperty"><strong>clSetCommandQueueProperty</strong></a> is <a href="#unified-spec">deprecated by</a> version 1.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> specifies the command-queue being modified.</p> |
| </li> |
| <li> |
| <p><em>properties</em> specifies the new list of properties for the command-queue. |
| This is a bit-field and the supported properties are described in the |
| <a href="#legacy-queue-properties-table">Command-Queue Properties table</a> for |
| <a href="#clCreateCommandQueue"><strong>clCreateCommandQueue</strong></a>. |
| Only command-queue properties specified in this table can be used, |
| otherwise the value specified in <em>properties</em> is considered to be not |
| valid.</p> |
| </li> |
| <li> |
| <p><em>enable</em> determines whether the values specified by <em>properties</em> are |
| enabled (if <em>enable</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>) or disabled (if <em>enable</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a>) |
| for the command-queue.</p> |
| </li> |
| <li> |
| <p><em>old_properties</em> returns the command-queue properties before they were |
| changed by <a href="#clSetCommandQueueProperty"><strong>clSetCommandQueueProperty</strong></a>. If <em>old_properties</em> is <code>NULL</code>, it |
| is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="paragraph"> |
| <p>Changing the <a href="#CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE"><code>CL_QUEUE_<wbr>OUT_<wbr>OF_<wbr>ORDER_<wbr>EXEC_<wbr>MODE_<wbr>ENABLE</code></a> command-queue property |
| will cause the OpenCL implementation to block until all previously queued |
| commands in <em>command_queue</em> have completed. This can be an expensive operation |
| and therefore changes to this property should only be done when absolutely |
| necessary.</p> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clSetCommandQueueProperty"><strong>clSetCommandQueueProperty</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>properties</em> are not valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_QUEUE_PROPERTIES"><code>CL_INVALID_<wbr>QUEUE_<wbr>PROPERTIES</code></a> if values specified in <em>properties</em> are |
| valid but are not supported by the device.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_buffer_objects"><a class="anchor" href="#_buffer_objects"></a>5.2. Buffer Objects</h3> |
| <div class="paragraph"> |
| <p>A <em>buffer</em> object stores a one-dimensional collection of elements. |
| Elements of a <em>buffer</em> object can be a scalar data type (such as an int, |
| float), vector data type, or a user-defined structure.</p> |
| </div> |
| <div class="sect3"> |
| <h4 id="_creating_buffer_objects"><a class="anchor" href="#_creating_buffer_objects"></a>5.2.1. Creating Buffer Objects</h4> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>A <strong>buffer object</strong> may be created using the function</p> |
| </div> |
| <div id="clCreateBuffer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_mem clCreateBuffer( |
| cl_context context, |
| cl_mem_flags flags, |
| size_t size, |
| <span class="directive">void</span>* host_ptr, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>A <strong>buffer object</strong> may also be created with additional properties using the function</p> |
| </div> |
| <div id="clCreateBufferWithProperties" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_mem clCreateBufferWithProperties( |
| cl_context context, |
| <span class="directive">const</span> cl_mem_properties* properties, |
| cl_mem_flags flags, |
| size_t size, |
| <span class="directive">void</span>* host_ptr, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> is <a href="#unified-spec">missing before</a> version 3.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> is a valid OpenCL context used to create the buffer object.</p> |
| </li> |
| <li> |
| <p><em>properties</em> is an optional list of properties for the buffer object and their corresponding values. |
| The list is terminated with the special property <code>0</code>. |
| If no properties are required, <em>properties</em> may be <code>NULL</code>. |
| OpenCL 3.0 does not define any optional properties for buffers.</p> |
| </li> |
| <li> |
| <p><em>flags</em> is a bit-field that is used to specify allocation and usage |
| information about the image memory object being created and is described in |
| the <a href="#memory-flags-table">supported memory flag values</a> table.</p> |
| </li> |
| <li> |
| <p><em>size</em> is the size in bytes of the buffer memory object to be allocated.</p> |
| </li> |
| <li> |
| <p><em>host_ptr</em> is a pointer to the buffer data that may already be allocated |
| by the application. |
| The size of the buffer that <em>host_ptr</em> points to must be greater than or equal to <em>size</em> |
| bytes.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> may return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The alignment requirements for data stored in buffer objects are described |
| in <a href="#alignment-app-data-types">Alignment of Application Data Types</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> or <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> is called with |
| <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> set in its <em>flags</em> argument, the contents of the |
| memory pointed to by <em>host_ptr</em> at the time of the <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> call |
| define the initial contents of the buffer object.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> or <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> is called with a |
| pointer returned by <a href="#clSVMAlloc"><strong>clSVMAlloc</strong></a> as its <em>host_ptr</em> argument, and |
| <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> is set in its <em>flags</em> argument, <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> or |
| <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> will succeed and return a valid non-zero |
| buffer object as long as the <em>size</em> argument is no larger than the |
| <em>size</em> argument passed in the original <a href="#clSVMAlloc"><strong>clSVMAlloc</strong></a> call. |
| The new buffer object returned has the shared memory as the underlying |
| storage. |
| Locations in the buffers underlying shared memory can be operated on using |
| atomic operations to the devices level of support as defined in the memory |
| model.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> and <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> returns a valid non-zero |
| buffer object and <em>errcode_ret</em> is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the buffer object |
| is created successfully. |
| Otherwise, they return a <code>NULL</code> value with one of the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_PROPERTY"><code>CL_INVALID_<wbr>PROPERTY</code></a> if a property name in <em>properties</em> is not a |
| supported property name, if the value specified for a supported property |
| name is not valid, or if the same property name is specified more than |
| once.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>flags</em> are not valid as defined |
| in the <a href="#memory-flags-table">Memory Flags</a> table.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_BUFFER_SIZE"><code>CL_INVALID_<wbr>BUFFER_<wbr>SIZE</code></a> if <em>size</em> is 0 or if <em>size</em> is greater than |
| <a href="#CL_DEVICE_MAX_MEM_ALLOC_SIZE"><code>CL_DEVICE_<wbr>MAX_<wbr>MEM_<wbr>ALLOC_<wbr>SIZE</code></a> for all devices in <em>context</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_HOST_PTR"><code>CL_INVALID_<wbr>HOST_<wbr>PTR</code></a> if <em>host_ptr</em> is <code>NULL</code> and <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> or |
| <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> are set in <em>flags</em> or if <em>host_ptr</em> is not <code>NULL</code> |
| but <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> are not set in <em>flags</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for buffer object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="memory-flags-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 12. List of supported memory flag values</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Memory Flags</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_READ_WRITE"></a><a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the memory object will be read |
| and written by a kernel. |
| This is the default.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_WRITE_ONLY"></a><a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the memory object will be |
| written but not read by a kernel.</p> |
| <p class="tableblock"> Reading from a buffer or image object created with <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> |
| inside a kernel is undefined.</p> |
| <p class="tableblock"> <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a> and <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> are mutually exclusive.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_READ_ONLY"></a><a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the memory object is a |
| readonly memory object when used inside a kernel.</p> |
| <p class="tableblock"> Writing to a buffer or image object created with <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a> inside |
| a kernel is undefined.</p> |
| <p class="tableblock"> <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a> or <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> and <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a> are mutually |
| exclusive.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_USE_HOST_PTR"></a><a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag is valid only if host_ptr is not <code>NULL</code>. |
| If specified, it indicates that the application wants the OpenCL |
| implementation to use memory referenced by host_ptr as the storage bits |
| for the memory object.</p> |
| <p class="tableblock"> The contents of the memory pointed to by host_ptr at the time of the |
| <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a>, <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a>, <a href="#clCreateImage"><strong>clCreateImage</strong></a>, |
| <a href="#clCreateImageWithProperties"><strong>clCreateImageWithProperties</strong></a>, <a href="#clCreateImage2D"><strong>clCreateImage2D</strong></a>, or <a href="#clCreateImage3D"><strong>clCreateImage3D</strong></a> |
| call define the initial contents of the memory object.</p> |
| <p class="tableblock"> OpenCL implementations are allowed to cache the contents pointed |
| to by host_ptr in device memory. |
| This cached copy can be used when kernels are executed on a device.</p> |
| <p class="tableblock"> The result of OpenCL commands that operate on multiple buffer objects |
| created with the same host_ptr or from overlapping host or SVM regions |
| is considered to be undefined.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_ALLOC_HOST_PTR"></a><a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the application wants the OpenCL implementation |
| to allocate memory from host accessible memory.</p> |
| <p class="tableblock"> <a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a> and <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> are mutually exclusive.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_COPY_HOST_PTR"></a><a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag is valid only if host_ptr is not <code>NULL</code>. |
| If specified, it indicates that the application wants the OpenCL |
| implementation to allocate memory for the memory object and copy the |
| data from memory referenced by host_ptr. |
| The implementation will copy the memory immediately and host_ptr is |
| available for reuse by the application when the <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a>, |
| <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a>, <a href="#clCreateImage"><strong>clCreateImage</strong></a>, <a href="#clCreateImageWithProperties"><strong>clCreateImageWithProperties</strong></a>, |
| <a href="#clCreateImage2D"><strong>clCreateImage2D</strong></a>, or <a href="#clCreateImage3D"><strong>clCreateImage3D</strong></a> operation returns.</p> |
| <p class="tableblock"> <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> and <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> are mutually exclusive.</p> |
| <p class="tableblock"> <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> can be used with <a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a> to |
| initialize the contents of the <code>cl_mem</code> object allocated using |
| host-accessible (e.g. PCIe) memory.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_HOST_WRITE_ONLY"></a><a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the host will only write to the memory object |
| (using OpenCL APIs that enqueue a write or a map for write). |
| This can be used to optimize write access from the host (e.g. enable |
| write-combined allocations for memory objects for devices that |
| communicate with the host over a system bus such as PCIe).</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_HOST_READ_ONLY"></a><a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the host will only read |
| the memory object (using OpenCL APIs that enqueue a read or a map for |
| read).</p> |
| <p class="tableblock"> <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> and <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> are mutually exclusive.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_HOST_NO_ACCESS"></a><a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the host will not read or |
| write the memory object.</p> |
| <p class="tableblock"> <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> or <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> and |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a> are mutually exclusive.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_KERNEL_READ_AND_WRITE"></a><a href="#CL_MEM_KERNEL_READ_AND_WRITE"><code>CL_MEM_<wbr>KERNEL_<wbr>READ_<wbr>AND_<wbr>WRITE</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag is only used by <a href="#clGetSupportedImageFormats"><strong>clGetSupportedImageFormats</strong></a> to query image |
| formats that may be both read from and written to by the same kernel |
| instance. |
| To create a memory object that may be read from and written to use |
| <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To create a new buffer object (referred to as a sub-buffer object) from an |
| existing buffer object, call the function</p> |
| </div> |
| <div id="clCreateSubBuffer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_mem clCreateSubBuffer( |
| cl_mem buffer, |
| cl_mem_flags flags, |
| cl_buffer_create_type buffer_create_type, |
| <span class="directive">const</span> <span class="directive">void</span>* buffer_create_info, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateSubBuffer"><strong>clCreateSubBuffer</strong></a> is <a href="#unified-spec">missing before</a> version 1.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>buffer</em> must be a valid buffer object and cannot be a sub-buffer object.</p> |
| </li> |
| <li> |
| <p><em>flags</em> is a bit-field that is used to specify allocation and usage |
| information about the sub-buffer memory object being created and is |
| described in the <a href="#memory-flags-table">Memory Flags</a> table. |
| If the <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>, <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a>, or <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> values are |
| not specified in <em>flags</em>, they are inherited from the corresponding memory |
| access qualifiers associated with <em>buffer</em>. |
| The <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, <a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a>, and <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> |
| values cannot be specified in <em>flags</em> but are inherited from the |
| corresponding memory access qualifiers associated with <em>buffer</em>. |
| If <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> is specified in the memory access qualifier values |
| associated with <em>buffer</em> it does not imply any additional copies when the |
| sub-buffer is created from <em>buffer</em>. |
| If the <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a>, <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a>, or |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a> values are not specified in <em>flags</em>, they are |
| inherited from the corresponding memory access qualifiers associated with |
| <em>buffer</em>.</p> |
| </li> |
| <li> |
| <p><em>buffer_create_type</em> and <em>buffer_create_info</em> describe the type of buffer |
| object to be created. |
| The list of supported values for <em>buffer_create_type</em> and corresponding |
| descriptor that <em>buffer_create_info</em> points to is described in the |
| <a href="#subbuffer-create-info-table">SubBuffer Attributes</a> table.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="subbuffer-create-info-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 13. List of supported buffer creation types by <a href="#clCreateSubBuffer">clCreateSubBuffer</a></caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Buffer Creation Type</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_BUFFER_CREATE_TYPE_REGION"></a><a href="#CL_BUFFER_CREATE_TYPE_REGION"><code>CL_BUFFER_<wbr>CREATE_<wbr>TYPE_<wbr>REGION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Create a buffer object that represents a specific region in <em>buffer</em>.</p> |
| <p class="tableblock"> <em>buffer_create_info</em> is a pointer to a <a href="#cl_buffer_region"><code>cl_buffer_<wbr>region</code></a> structure |
| specifying a region of the buffer.</p> |
| <p class="tableblock"> If <em>buffer</em> is created with <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, the <em>host_ptr</em> |
| associated with the buffer object returned is <em>host_ptr + origin</em>.</p> |
| <p class="tableblock"> The buffer object returned references the data store allocated for |
| buffer and points to the region specified by <em>buffer_create_info</em> in |
| this data store.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><a href="#clCreateSubBuffer"><strong>clCreateSubBuffer</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>buffer</em> is not a valid buffer object or is a |
| sub-buffer object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>buffer</em> was created with <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> and |
| <em>flags</em> specifies <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a> or <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a>, or if <em>buffer</em> |
| was created with <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a> and <em>flags</em> specifies |
| <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a> or <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a>, or if <em>flags</em> specifies |
| <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>buffer</em> was created with <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> and |
| <em>flags</em> specify <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a>, or if <em>buffer</em> was created with |
| <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> and <em>flags</em> specify <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a>, or if |
| <em>buffer</em> was created with <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a> and <em>flags</em> specify |
| <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> or <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if the value specified in <em>buffer_create_type</em> is not |
| valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if value(s) specified in <em>buffer_create_info</em> (for a |
| given <em>buffer_create_type</em>) is not valid or if <em>buffer_create_info</em> is |
| <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for sub-buffer object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if the region specified by the <a href="#cl_buffer_region"><code>cl_buffer_<wbr>region</code></a> |
| structure passed in <em>buffer_create_info</em> is out of bounds in <em>buffer</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_BUFFER_SIZE"><code>CL_INVALID_<wbr>BUFFER_<wbr>SIZE</code></a> if the <em>size</em> field of the <a href="#cl_buffer_region"><code>cl_buffer_<wbr>region</code></a> |
| structure passed in <em>buffer_create_info</em> is 0.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if there are no devices in <em>context</em> |
| associated with <em>buffer</em> for which the <em>origin</em> field of the |
| <a href="#cl_buffer_region"><code>cl_buffer_<wbr>region</code></a> structure passed in <em>buffer_create_info</em> is |
| aligned to the <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="paragraph"> |
| <p>Concurrent reading from, writing to and copying between both a buffer object |
| and its sub-buffer object(s) is undefined. |
| Concurrent reading from, writing to and copying between overlapping |
| sub-buffer objects created with the same buffer object is undefined. |
| Only reading from both a buffer object and its sub-buffer objects or reading |
| from multiple overlapping sub-buffer objects is defined.</p> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The <a href="#cl_buffer_region"><code>cl_buffer_<wbr>region</code></a> structure specifies a region of a buffer object:</p> |
| </div> |
| <div id="cl_buffer_region" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++"><span class="keyword">typedef</span> <span class="keyword">struct</span> cl_buffer_region { |
| size_t origin; |
| size_t size; |
| } cl_buffer_region;</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>origin</em> is the offset in bytes of the region.</p> |
| </li> |
| <li> |
| <p><em>size</em> is the size in bytes of the region.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Constraints on the values of <em>origin</em> and <em>size</em> are specified for the |
| <a href="#clCreateSubBuffer"><strong>clCreateSubBuffer</strong></a> function to which this structure is passed.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_reading_writing_and_copying_buffer_objects"><a class="anchor" href="#_reading_writing_and_copying_buffer_objects"></a>5.2.2. Reading, Writing and Copying Buffer Objects</h4> |
| <div class="paragraph"> |
| <p>The following functions enqueue commands to read from a buffer object to |
| host memory or write to a buffer object from host memory.</p> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To read from a buffer object to host memory or to write to a buffer object from |
| host memory call one of the functions</p> |
| </div> |
| <div id="clEnqueueReadBuffer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueReadBuffer( |
| cl_command_queue command_queue, |
| cl_mem buffer, |
| cl_bool blocking_read, |
| size_t offset, |
| size_t size, |
| <span class="directive">void</span>* ptr, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div id="clEnqueueWriteBuffer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueWriteBuffer( |
| cl_command_queue command_queue, |
| cl_mem buffer, |
| cl_bool blocking_write, |
| size_t offset, |
| size_t size, |
| <span class="directive">const</span> <span class="directive">void</span>* ptr, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> is a valid host command-queue in which the read / write |
| command will be queued. |
| <em>command_queue</em> and <em>buffer</em> must be created with the same OpenCL context.</p> |
| </li> |
| <li> |
| <p><em>buffer</em> refers to a valid buffer object.</p> |
| </li> |
| <li> |
| <p><em>blocking_read</em> and <em>blocking_write</em> indicate if the read and write |
| operations are <em>blocking</em> or <em>non-blocking</em> (see below).</p> |
| </li> |
| <li> |
| <p><em>offset</em> is the offset in bytes in the buffer object to read from or write |
| to.</p> |
| </li> |
| <li> |
| <p><em>size</em> is the size in bytes of data being read or written.</p> |
| </li> |
| <li> |
| <p><em>ptr</em> is the pointer to buffer in host memory where data is to be read into |
| or to be written from.</p> |
| </li> |
| <li> |
| <p><em>event_wait_list</em> and <em>num_events_in_wait_list</em> specify events that need to |
| complete before this particular command can be executed. |
| If <em>event_wait_list</em> is <code>NULL</code>, then this particular command does not wait |
| on any event to complete. |
| If <em>event_wait_list</em> is <code>NULL</code>, <em>num_events_in_wait_list</em> must be 0. |
| If <em>event_wait_list</em> is not <code>NULL</code>, the list of events pointed to by |
| <em>event_wait_list</em> must be valid and <em>num_events_in_wait_list</em> must be |
| greater than 0. |
| The events specified in <em>event_wait_list</em> act as synchronization points. |
| The context associated with events in <em>event_wait_list</em> and <em>command_queue</em> |
| must be the same. |
| The memory associated with <em>event_wait_list</em> can be reused or freed after |
| the function returns.</p> |
| </li> |
| <li> |
| <p><em>event</em> returns an event object that identifies this read / write command |
| and can be used to query or queue a wait for this command to complete. |
| If <em>event</em> is <code>NULL</code> or the enqueue is unsuccessful, no event will be |
| created and therefore it will not be possible to query the status of this |
| command or to wait for this command to complete. |
| If <em>event_wait_list</em> and <em>event</em> are not <code>NULL</code>, <em>event</em> must not refer |
| to an element of the <em>event_wait_list</em> array.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_read</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a> i.e. the read command is blocking, |
| <a href="#clEnqueueReadBuffer"><strong>clEnqueueReadBuffer</strong></a> does not return until the buffer data has been read |
| and copied into memory pointed to by <em>ptr</em>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_read</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a> i.e. the read command is non-blocking, |
| <a href="#clEnqueueReadBuffer"><strong>clEnqueueReadBuffer</strong></a> queues a non-blocking read command and returns. |
| The contents of the buffer that <em>ptr</em> points to cannot be used until the |
| read command has completed. |
| The <em>event</em> argument returns an event object which can be used to query the |
| execution status of the read command. |
| When the read command has completed, the contents of the buffer that <em>ptr</em> |
| points to can be used by the application.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_write</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, the write command is blocking and does not |
| return until the command is complete, including transfer of the data. |
| The memory pointed to by <em>ptr</em> can be reused by the application after the |
| <a href="#clEnqueueWriteBuffer"><strong>clEnqueueWriteBuffer</strong></a> call returns.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_write</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a>, the OpenCL implementation will use <em>ptr</em> to |
| perform a non-blocking write. |
| As the write is non-blocking the implementation can return immediately. |
| The memory pointed to by <em>ptr</em> cannot be reused by the application after the |
| call returns. |
| The <em>event</em> argument returns an event object which can be used to query the |
| execution status of the write command. |
| When the write command has completed, the memory pointed to by <em>ptr</em> can |
| then be reused by the application.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clEnqueueReadBuffer"><strong>clEnqueueReadBuffer</strong></a> and <a href="#clEnqueueWriteBuffer"><strong>clEnqueueWriteBuffer</strong></a> return <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the |
| function is executed successfully. |
| Otherwise, they return one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid host |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if the context associated with <em>command_queue</em> and |
| <em>buffer</em> are not the same or if the context associated with |
| <em>command_queue</em> and events in <em>event_wait_list</em> are not the same.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>buffer</em> is not a valid buffer object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if the region being read or written specified by |
| (<em>offset</em>, <em>size</em>) is out of bounds or if <em>ptr</em> is a <code>NULL</code> value.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_EVENT_WAIT_LIST"><code>CL_INVALID_<wbr>EVENT_<wbr>WAIT_<wbr>LIST</code></a> if <em>event_wait_list</em> is <code>NULL</code> and |
| <em>num_events_in_wait_list</em> > 0, or <em>event_wait_list</em> is not <code>NULL</code> and |
| <em>num_events_in_wait_list</em> is 0, or if event objects in <em>event_wait_list</em> |
| are not valid events.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>buffer</em> is a sub-buffer object and |
| <em>offset</em> specified when the sub-buffer object is created is not aligned |
| to <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for device associated with |
| <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST"><code>CL_EXEC_<wbr>STATUS_<wbr>ERROR_<wbr>FOR_<wbr>EVENTS_<wbr>IN_<wbr>WAIT_<wbr>LIST</code></a> if the read and write |
| operations are blocking and the execution status of any of the events in |
| <em>event_wait_list</em> is a negative integer value. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for data store associated with <em>buffer</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <a href="#clEnqueueReadBuffer"><strong>clEnqueueReadBuffer</strong></a> is called on <em>buffer</em> |
| which has been created with <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> or |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <a href="#clEnqueueWriteBuffer"><strong>clEnqueueWriteBuffer</strong></a> is called on <em>buffer</em> |
| which has been created with <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> or |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The following functions enqueue commands to read a 2D or 3D rectangular |
| region from a buffer object to host memory or write a 2D or 3D rectangular |
| region to a buffer object from host memory.</p> |
| </div> |
| <div id="clEnqueueReadBufferRect" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueReadBufferRect( |
| cl_command_queue command_queue, |
| cl_mem buffer, |
| cl_bool blocking_read, |
| <span class="directive">const</span> size_t* buffer_origin, |
| <span class="directive">const</span> size_t* host_origin, |
| <span class="directive">const</span> size_t* region, |
| size_t buffer_row_pitch, |
| size_t buffer_slice_pitch, |
| size_t host_row_pitch, |
| size_t host_slice_pitch, |
| <span class="directive">void</span>* ptr, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clEnqueueReadBufferRect"><strong>clEnqueueReadBufferRect</strong></a> is <a href="#unified-spec">missing before</a> version 1.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div id="clEnqueueWriteBufferRect" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueWriteBufferRect( |
| cl_command_queue command_queue, |
| cl_mem buffer, |
| cl_bool blocking_write, |
| <span class="directive">const</span> size_t* buffer_origin, |
| <span class="directive">const</span> size_t* host_origin, |
| <span class="directive">const</span> size_t* region, |
| size_t buffer_row_pitch, |
| size_t buffer_slice_pitch, |
| size_t host_row_pitch, |
| size_t host_slice_pitch, |
| <span class="directive">const</span> <span class="directive">void</span>* ptr, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clEnqueueWriteBufferRect"><strong>clEnqueueWriteBufferRect</strong></a> is <a href="#unified-spec">missing before</a> version 1.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> refers is a valid host command-queue in which the read / |
| write command will be queued. |
| <em>command_queue</em> and <em>buffer</em> must be created with the same OpenCL context.</p> |
| </li> |
| <li> |
| <p><em>buffer</em> refers to a valid buffer object.</p> |
| </li> |
| <li> |
| <p><em>blocking_read</em> and <em>blocking_write</em> indicate if the read and write |
| operations are <em>blocking</em> or <em>non-blocking</em> (see below).</p> |
| </li> |
| <li> |
| <p><em>buffer_origin</em> defines the (<em>x</em>, <em>y</em>, <em>z</em>) offset in the memory region |
| associated with <em>buffer</em>. |
| For a 2D rectangle region, the <em>z</em> value given by <em>buffer_origin</em>[2] should |
| be 0. |
| The offset in bytes is computed as <em>buffer_origin</em>[2] × |
| <em>buffer_slice_pitch</em> + <em>buffer_origin</em>[1] × <em>buffer_row_pitch</em> + |
| <em>buffer_origin</em>[0].</p> |
| </li> |
| <li> |
| <p><em>host_origin</em> defines the (<em>x</em>, <em>y</em>, <em>z</em>) offset in the memory region |
| pointed to by <em>ptr</em>. |
| For a 2D rectangle region, the <em>z</em> value given by <em>host_origin</em>[2] should be |
| 0. |
| The offset in bytes is computed as <em>host_origin</em>[2] × |
| <em>host_slice_pitch</em> + <em>host_origin</em>[1] × <em>host_row_pitch</em> + |
| <em>host_origin</em>[0].</p> |
| </li> |
| <li> |
| <p><em>region</em> defines the (<em>width</em> in bytes, <em>height</em> in rows, <em>depth</em> in slices) |
| of the 2D or 3D rectangle being read or written. |
| For a 2D rectangle copy, the <em>depth</em> value given by <em>region</em>[2] should be 1. |
| The values in region cannot be 0.</p> |
| </li> |
| <li> |
| <p><em>buffer_row_pitch</em> is the length of each row in bytes to be used for the |
| memory region associated with <em>buffer</em>. |
| If <em>buffer_row_pitch</em> is 0, <em>buffer_row_pitch</em> is computed as <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><em>buffer_slice_pitch</em> is the length of each 2D slice in bytes to be used for |
| the memory region associated with <em>buffer</em>. |
| If <em>buffer_slice_pitch</em> is 0, <em>buffer_slice_pitch</em> is computed as |
| <em>region</em>[1] × <em>buffer_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><em>host_row_pitch</em> is the length of each row in bytes to be used for the |
| memory region pointed to by <em>ptr</em>. |
| If <em>host_row_pitch</em> is 0, <em>host_row_pitch</em> is computed as <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><em>host_slice_pitch</em> is the length of each 2D slice in bytes to be used for |
| the memory region pointed to by <em>ptr</em>. |
| If <em>host_slice_pitch</em> is 0, <em>host_slice_pitch</em> is computed as <em>region</em>[1] |
| × <em>host_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><em>ptr</em> is the pointer to buffer in host memory where data is to be read into |
| or to be written from.</p> |
| </li> |
| <li> |
| <p><em>event_wait_list</em> and <em>num_events_in_wait_list</em> specify events that need to |
| complete before this particular command can be executed. |
| If <em>event_wait_list</em> is <code>NULL</code>, then this particular command does not wait |
| on any event to complete. |
| If <em>event_wait_list</em> is <code>NULL</code>, <em>num_events_in_wait_list</em> must be 0. |
| If <em>event_wait_list</em> is not <code>NULL</code>, the list of events pointed to by |
| <em>event_wait_list</em> must be valid and <em>num_events_in_wait_list</em> must be |
| greater than 0. |
| The events specified in <em>event_wait_list</em> act as synchronization points. |
| The context associated with events in <em>event_wait_list</em> and <em>command_queue</em> |
| must be the same. |
| The memory associated with <em>event_wait_list</em> can be reused or freed after |
| the function returns.</p> |
| </li> |
| <li> |
| <p><em>event</em> returns an event object that identifies this read / write command |
| and can be used to query or queue a wait for this command to complete. |
| If <em>event</em> is <code>NULL</code> or the enqueue is unsuccessful, no event will be |
| created and therefore it will not be possible to query the status of this |
| command or to wait for this command to complete. |
| If <em>event_wait_list</em> and <em>event</em> are not <code>NULL</code>, <em>event</em> must not refer |
| to an element of the <em>event_wait_list</em> array.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_read</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a> i.e. the read command is blocking, |
| <a href="#clEnqueueReadBufferRect"><strong>clEnqueueReadBufferRect</strong></a> does not return until the buffer data has been |
| read and copied into memory pointed to by <em>ptr</em>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_read</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a> i.e. the read command is non-blocking, |
| <a href="#clEnqueueReadBufferRect"><strong>clEnqueueReadBufferRect</strong></a> queues a non-blocking read command and returns. |
| The contents of the buffer that <em>ptr</em> points to cannot be used until the |
| read command has completed. |
| The <em>event</em> argument returns an event object which can be used to query the |
| execution status of the read command. |
| When the read command has completed, the contents of the buffer that <em>ptr</em> |
| points to can be used by the application.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_write</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, the write command is blocking and does not |
| return until the command is complete, including transfer of the data. |
| The memory pointed to by <em>ptr</em> can be reused by the application after the |
| <a href="#clEnqueueWriteBufferRect"><strong>clEnqueueWriteBufferRect</strong></a> call returns.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_write</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a>, the OpenCL implementation will use <em>ptr</em> to |
| perform a non-blocking write. |
| As the write is non-blocking the implementation can return immediately. |
| The memory pointed to by <em>ptr</em> cannot be reused by the application after the |
| call returns. |
| The <em>event</em> argument returns an event object which can be used to query the |
| execution status of the write command. |
| When the write command has completed, the memory pointed to by <em>ptr</em> can |
| then be reused by the application.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clEnqueueReadBufferRect"><strong>clEnqueueReadBufferRect</strong></a> and <a href="#clEnqueueWriteBufferRect"><strong>clEnqueueWriteBufferRect</strong></a> return <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> |
| if the function is executed successfully. |
| Otherwise, they return one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid host |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if the context associated with <em>command_queue</em> and |
| <em>buffer</em> are not the same or if the context associated with |
| <em>command_queue</em> and events in <em>event_wait_list</em> are not the same.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>buffer</em> is not a valid buffer object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>buffer_origin</em>, <em>host_origin</em>, or <em>region</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if the region being read or written specified by |
| (<em>buffer_origin</em>, <em>region</em>, <em>buffer_row_pitch</em>, <em>buffer_slice_pitch</em>) is |
| out of bounds.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if any <em>region</em> array element is 0.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>buffer_row_pitch</em> is not 0 and is less than |
| <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>host_row_pitch</em> is not 0 and is less than |
| <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>buffer_slice_pitch</em> is not 0 and is less than |
| <em>region</em>[1] × <em>buffer_row_pitch</em> and not a multiple of |
| <em>buffer_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>host_slice_pitch</em> is not 0 and is less than |
| <em>region</em>[1] × <em>host_row_pitch</em> and not a multiple of |
| <em>host_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>ptr</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_EVENT_WAIT_LIST"><code>CL_INVALID_<wbr>EVENT_<wbr>WAIT_<wbr>LIST</code></a> if <em>event_wait_list</em> is <code>NULL</code> and |
| <em>num_events_in_wait_list</em> > 0, or <em>event_wait_list</em> is not <code>NULL</code> and |
| <em>num_events_in_wait_list</em> is 0, or if event objects in <em>event_wait_list</em> |
| are not valid events.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>buffer</em> is a sub-buffer object and |
| <em>offset</em> specified when the sub-buffer object is created is not aligned |
| to <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for device associated with |
| <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST"><code>CL_EXEC_<wbr>STATUS_<wbr>ERROR_<wbr>FOR_<wbr>EVENTS_<wbr>IN_<wbr>WAIT_<wbr>LIST</code></a> if the read and write |
| operations are blocking and the execution status of any of the events in |
| <em>event_wait_list</em> is a negative integer value. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for data store associated with <em>buffer</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <a href="#clEnqueueReadBufferRect"><strong>clEnqueueReadBufferRect</strong></a> is called on <em>buffer</em> |
| which has been created with <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> or |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <a href="#clEnqueueWriteBufferRect"><strong>clEnqueueWriteBufferRect</strong></a> is called on <em>buffer</em> |
| which has been created with <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> or |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="paragraph"> |
| <p>Calling <a href="#clEnqueueReadBuffer"><strong>clEnqueueReadBuffer</strong></a> to read a region of the buffer object with the |
| <em>ptr</em> argument value set to <em>host_ptr</em> + <em>offset</em>, where <em>host_ptr</em> is a |
| pointer to the memory region specified when the buffer object being read is |
| created with <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, must meet the following requirements in |
| order to avoid undefined behavior:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>All commands that use this buffer object or a memory object (buffer or |
| image) created from this buffer object have finished execution before |
| the read command begins execution.</p> |
| </li> |
| <li> |
| <p>The buffer object or memory objects created from this buffer object are |
| not mapped.</p> |
| </li> |
| <li> |
| <p>The buffer object or memory objects created from this buffer object are |
| not used by any command-queue until the read command has finished |
| execution.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Calling <a href="#clEnqueueReadBufferRect"><strong>clEnqueueReadBufferRect</strong></a> to read a region of the buffer object with |
| the <em>ptr</em> argument value set to <em>host_ptr</em> and <em>host_origin</em>, |
| <em>buffer_origin</em> values are the same, where <em>host_ptr</em> is a pointer to the |
| memory region specified when the buffer object being read is created with |
| <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, must meet the same requirements given above for |
| <a href="#clEnqueueReadBuffer"><strong>clEnqueueReadBuffer</strong></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Calling <a href="#clEnqueueWriteBuffer"><strong>clEnqueueWriteBuffer</strong></a> to update the latest bits in a region of the |
| buffer object with the <em>ptr</em> argument value set to <em>host_ptr</em> + <em>offset</em>, |
| where <em>host_ptr</em> is a pointer to the memory region specified when the buffer |
| object being written is created with <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, must meet the |
| following requirements in order to avoid undefined behavior:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The host memory region given by (<em>host_ptr</em> + <em>offset</em>, <em>cb</em>) contains |
| the latest bits when the enqueued write command begins execution.</p> |
| </li> |
| <li> |
| <p>The buffer object or memory objects created from this buffer object are |
| not mapped.</p> |
| </li> |
| <li> |
| <p>The buffer object or memory objects created from this buffer object are |
| not used by any command-queue until the write command has finished |
| execution.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Calling <a href="#clEnqueueWriteBufferRect"><strong>clEnqueueWriteBufferRect</strong></a> to update the latest bits in a region of |
| the buffer object with the <em>ptr</em> argument value set to <em>host_ptr</em> and |
| <em>host_origin</em>, <em>buffer_origin</em> values are the same, where <em>host_ptr</em> is a |
| pointer to the memory region specified when the buffer object being written |
| is created with <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, must meet the following requirements in |
| order to avoid undefined behavior:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The host memory region given by (<em>buffer_origin region</em>) contains the |
| latest bits when the enqueued write command begins execution.</p> |
| </li> |
| <li> |
| <p>The buffer object or memory objects created from this buffer object are |
| not mapped.</p> |
| </li> |
| <li> |
| <p>The buffer object or memory objects created from this buffer object are |
| not used by any command-queue until the write command has finished |
| execution.</p> |
| </li> |
| </ul> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To enqueue a command to copy a buffer object identified by <em>src_buffer</em> to |
| another buffer object identified by <em>dst_buffer</em>, call the function</p> |
| </div> |
| <div id="clEnqueueCopyBuffer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueCopyBuffer( |
| cl_command_queue command_queue, |
| cl_mem src_buffer, |
| cl_mem dst_buffer, |
| size_t src_offset, |
| size_t dst_offset, |
| size_t size, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> refers to a host command-queue in which the copy command |
| will be queued. |
| The OpenCL context associated with <em>command_queue</em>, <em>src_buffer</em> and |
| <em>dst_buffer</em> must be the same.</p> |
| </li> |
| <li> |
| <p><em>src_offset</em> refers to the offset where to begin copying data from |
| <em>src_buffer</em>.</p> |
| </li> |
| <li> |
| <p><em>dst_offset</em> refers to the offset where to begin copying data into |
| <em>dst_buffer</em>.</p> |
| </li> |
| <li> |
| <p><em>size</em> refers to the size in bytes to copy.</p> |
| </li> |
| <li> |
| <p><em>event_wait_list</em> and <em>num_events_in_wait_list</em> specify events that need to |
| complete before this particular command can be executed. |
| If <em>event_wait_list</em> is <code>NULL</code>, then this particular command does not wait |
| on any event to complete. |
| If <em>event_wait_list</em> is <code>NULL</code>, <em>num_events_in_wait_list</em> must be 0. |
| If <em>event_wait_list</em> is not <code>NULL</code>, the list of events pointed to by |
| <em>event_wait_list</em> must be valid and <em>num_events_in_wait_list</em> must be |
| greater than 0. |
| The events specified in <em>event_wait_list</em> act as synchronization points. |
| The context associated with events in <em>event_wait_list</em> and <em>command_queue</em> |
| must be the same. |
| The memory associated with <em>event_wait_list</em> can be reused or freed after |
| the function returns.</p> |
| </li> |
| <li> |
| <p><em>event</em> returns an event object that identifies this copy command |
| and can be used to query or queue a wait for this command to complete. |
| If <em>event</em> is <code>NULL</code> or the enqueue is unsuccessful, no event will be |
| created and therefore it will not be possible to query the status of this |
| command or to wait for this command to complete. |
| If <em>event_wait_list</em> and <em>event</em> are not <code>NULL</code>, <em>event</em> must not refer |
| to an element of the <em>event_wait_list</em> array.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clEnqueueCopyBuffer"><strong>clEnqueueCopyBuffer</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid host |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if the context associated with <em>command_queue</em>, |
| <em>src_buffer</em> and <em>dst_buffer</em> are not the same or if the context |
| associated with <em>command_queue</em> and events in <em>event_wait_list</em> are not |
| the same.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>src_buffer</em> and <em>dst_buffer</em> are not valid |
| buffer objects.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>src_offset</em>, <em>dst_offset</em>, <em>size</em>, <em>src_offset</em> |
| + <em>size</em> or <em>dst_offset</em> + <em>size</em> require accessing elements |
| outside the <em>src_buffer</em> and <em>dst_buffer</em> buffer objects respectively.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_EVENT_WAIT_LIST"><code>CL_INVALID_<wbr>EVENT_<wbr>WAIT_<wbr>LIST</code></a> if <em>event_wait_list</em> is <code>NULL</code> and |
| <em>num_events_in_wait_list</em> > 0, or <em>event_wait_list</em> is not <code>NULL</code> and |
| <em>num_events_in_wait_list</em> is 0, or if event objects in <em>event_wait_list</em> |
| are not valid events.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>src_buffer</em> is a sub-buffer object |
| and <em>offset</em> specified when the sub-buffer object is created is not |
| aligned to <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for device associated |
| with <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>dst_buffer</em> is a sub-buffer object |
| and <em>offset</em> specified when the sub-buffer object is created is not |
| aligned to <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for device associated |
| with <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_COPY_OVERLAP"><code>CL_MEM_<wbr>COPY_<wbr>OVERLAP</code></a> if <em>src_buffer</em> and <em>dst_buffer</em> are the same buffer |
| or sub-buffer object and the source and destination regions overlap or |
| if <em>src_buffer</em> and <em>dst_buffer</em> are different sub-buffers of the same |
| associated buffer object and they overlap. |
| The regions overlap if <em>src_offset</em> ≤ <em>dst_offset</em> ≤ |
| <em>src_offset</em> + <em>size</em> - 1 or if <em>dst_offset</em> ≤ <em>src_offset</em> ≤ |
| <em>dst_offset</em> + <em>size</em> - 1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for data store associated with <em>src_buffer</em> or <em>dst_buffer</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To enqueue a command to copy a 2D or 3D rectangular region from the buffer |
| object identified by <em>src_buffer</em> to a 2D or 3D region in the buffer object |
| identified by <em>dst_buffer</em>, call the function</p> |
| </div> |
| <div id="clEnqueueCopyBufferRect" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueCopyBufferRect( |
| cl_command_queue command_queue, |
| cl_mem src_buffer, |
| cl_mem dst_buffer, |
| <span class="directive">const</span> size_t* src_origin, |
| <span class="directive">const</span> size_t* dst_origin, |
| <span class="directive">const</span> size_t* region, |
| size_t src_row_pitch, |
| size_t src_slice_pitch, |
| size_t dst_row_pitch, |
| size_t dst_slice_pitch, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clEnqueueCopyBufferRect"><strong>clEnqueueCopyBufferRect</strong></a> is <a href="#unified-spec">missing before</a> version 1.1. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> refers to the host command-queue in which the copy command |
| will be queued. |
| The OpenCL context associated with <em>command_queue</em>, <em>src_buffer</em> and |
| <em>dst_buffer</em> must be the same.</p> |
| </li> |
| <li> |
| <p><em>src_origin</em> defines the (<em>x</em>, <em>y</em>, <em>z</em>) offset in the memory region |
| associated with <em>src_buffer</em>. |
| For a 2D rectangle region, the <em>z</em> value given by <em>src_origin</em>[2] should be |
| 0. |
| The offset in bytes is computed as <em>src_origin</em>[2] × <em>src_slice_pitch</em> |
| + <em>src_origin</em>[1] × <em>src_row_pitch</em> + <em>src_origin</em>[0].</p> |
| </li> |
| <li> |
| <p><em>dst_origin</em> defines the (<em>x</em>, <em>y</em>, <em>z</em>) offset in the memory region |
| associated with <em>dst_buffer</em>. |
| For a 2D rectangle region, the <em>z</em> value given by <em>dst_origin</em>[2] should be |
| 0. |
| The offset in bytes is computed as <em>dst_origin</em>[2] × <em>dst_slice_pitch</em> |
| + <em>dst_origin</em>[1] × <em>dst_row_pitch</em> + <em>dst_origin</em>[0].</p> |
| </li> |
| <li> |
| <p><em>region</em> defines the (<em>width</em> in bytes, <em>height</em> in rows, <em>depth</em> in slices) |
| of the 2D or 3D rectangle being copied. |
| For a 2D rectangle, the <em>depth</em> value given by <em>region</em>[2] should be 1. |
| The values in region cannot be 0.</p> |
| </li> |
| <li> |
| <p><em>src_row_pitch</em> is the length of each row in bytes to be used for the memory |
| region associated with <em>src_buffer</em>. |
| If <em>src_row_pitch</em> is 0, <em>src_row_pitch</em> is computed as <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><em>src_slice_pitch</em> is the length of each 2D slice in bytes to be used for the |
| memory region associated with <em>src_buffer</em>. |
| If <em>src_slice_pitch</em> is 0, <em>src_slice_pitch</em> is computed as <em>region</em>[1] |
| × <em>src_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><em>dst_row_pitch</em> is the length of each row in bytes to be used for the memory |
| region associated with <em>dst_buffer</em>. |
| If <em>dst_row_pitch</em> is 0, <em>dst_row_pitch</em> is computed as <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><em>dst_slice_pitch</em> is the length of each 2D slice in bytes to be used for the |
| memory region associated with <em>dst_buffer</em>. |
| If <em>dst_slice_pitch</em> is 0, <em>dst_slice_pitch</em> is computed as <em>region</em>[1] |
| × <em>dst_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><em>event_wait_list</em> and <em>num_events_in_wait_list</em> specify events that need to |
| complete before this particular command can be executed. |
| If <em>event_wait_list</em> is <code>NULL</code>, then this particular command does not wait |
| on any event to complete. |
| If <em>event_wait_list</em> is <code>NULL</code>, <em>num_events_in_wait_list</em> must be 0. |
| If <em>event_wait_list</em> is not <code>NULL</code>, the list of events pointed to by |
| <em>event_wait_list</em> must be valid and <em>num_events_in_wait_list</em> must be |
| greater than 0. |
| The events specified in <em>event_wait_list</em> act as synchronization points. |
| The context associated with events in <em>event_wait_list</em> and <em>command_queue</em> |
| must be the same. |
| The memory associated with <em>event_wait_list</em> can be reused or freed after |
| the function returns.</p> |
| </li> |
| <li> |
| <p><em>event</em> returns an event object that identifies this copy command |
| and can be used to query or queue a wait for this command to complete. |
| If <em>event</em> is <code>NULL</code> or the enqueue is unsuccessful, no event will be |
| created and therefore it will not be possible to query the status of this |
| command or to wait for this command to complete. |
| If <em>event_wait_list</em> and <em>event</em> are not <code>NULL</code>, <em>event</em> must not refer |
| to an element of the <em>event_wait_list</em> array.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Copying begins at the source offset and destination offset which are |
| computed as described below in the description for <em>src_origin</em> and |
| <em>dst_origin</em>. |
| Each byte of the region’s width is copied from the source offset to the |
| destination offset. |
| After copying each width, the source and destination offsets are incremented |
| by their respective source and destination row pitches. |
| After copying each 2D rectangle, the source and destination offsets are |
| incremented by their respective source and destination slice pitches.</p> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="paragraph"> |
| <p>If <em>src_buffer</em> and <em>dst_buffer</em> are the same buffer object, <em>src_row_pitch</em> |
| must equal <em>dst_row_pitch</em> and <em>src_slice_pitch</em> must equal |
| <em>dst_slice_pitch</em>.</p> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clEnqueueCopyBufferRect"><strong>clEnqueueCopyBufferRect</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid host |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if the context associated with <em>command_queue</em>, |
| <em>src_buffer</em> and <em>dst_buffer</em> are not the same or if the context |
| associated with <em>command_queue</em> and events in <em>event_wait_list</em> are not |
| the same.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>src_buffer</em> and <em>dst_buffer</em> are not valid |
| buffer objects.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>src_origin</em>, <em>dst_origin</em>, or <em>region</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if (<em>src_origin</em>, <em>region</em>, <em>src_row_pitch</em>, |
| <em>src_slice_pitch</em>) or (<em>dst_origin</em>, <em>region</em>, <em>dst_row_pitch</em>, |
| <em>dst_slice_pitch</em>) require accessing elements outside the <em>src_buffer</em> |
| and <em>dst_buffer</em> buffer objects respectively.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if any <em>region</em> array element is 0.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>src_row_pitch</em> is not 0 and is less than |
| <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>dst_row_pitch</em> is not 0 and is less than |
| <em>region</em>[0].</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>src_slice_pitch</em> is not 0 and is less than |
| <em>region</em>[1] × <em>src_row_pitch</em> or if <em>src_slice_pitch</em> is not 0 and |
| is not a multiple of <em>src_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>dst_slice_pitch</em> is not 0 and is less than |
| <em>region</em>[1] × <em>dst_row_pitch</em> or if <em>dst_slice_pitch</em> is not 0 and |
| is not a multiple of <em>dst_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>src_buffer</em> and <em>dst_buffer</em> are the same buffer |
| object and <em>src_slice_pitch</em> is not equal to <em>dst_slice_pitch</em> and |
| <em>src_row_pitch</em> is not equal to <em>dst_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_EVENT_WAIT_LIST"><code>CL_INVALID_<wbr>EVENT_<wbr>WAIT_<wbr>LIST</code></a> if <em>event_wait_list</em> is <code>NULL</code> and |
| <em>num_events_in_wait_list</em> > 0, or <em>event_wait_list</em> is not <code>NULL</code> and |
| <em>num_events_in_wait_list</em> is 0, or if event objects in <em>event_wait_list</em> |
| are not valid events.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_COPY_OVERLAP"><code>CL_MEM_<wbr>COPY_<wbr>OVERLAP</code></a> if <em>src_buffer</em> and <em>dst_buffer</em> are the same buffer |
| or sub-buffer object and the source and destination regions overlap or |
| if <em>src_buffer</em> and <em>dst_buffer</em> are different sub-buffers of the same |
| associated buffer object and they overlap. |
| Refer to <a href="#check-copy-overlap">Checking for Memory Copy Overlap</a> for |
| details on how to determine if source and destination regions overlap.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>src_buffer</em> is a sub-buffer object |
| and <em>offset</em> specified when the sub-buffer object is created is not |
| aligned to <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for device associated |
| with <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>dst_buffer</em> is a sub-buffer object |
| and <em>offset</em> specified when the sub-buffer object is created is not |
| aligned to <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for device associated |
| with <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for data store associated with <em>src_buffer</em> or <em>dst_buffer</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_filling_buffer_objects"><a class="anchor" href="#_filling_buffer_objects"></a>5.2.3. Filling Buffer Objects</h4> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| Filling buffer objects is <a href="#unified-spec">missing before</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To enqueue a command to fill a buffer object with a pattern of a given |
| pattern size, call the function</p> |
| </div> |
| <div id="clEnqueueFillBuffer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueFillBuffer( |
| cl_command_queue command_queue, |
| cl_mem buffer, |
| <span class="directive">const</span> <span class="directive">void</span>* pattern, |
| size_t pattern_size, |
| size_t offset, |
| size_t size, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clEnqueueFillBuffer"><strong>clEnqueueFillBuffer</strong></a> is <a href="#unified-spec">missing before</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> refers to the host command-queue in which the fill command |
| will be queued. |
| The OpenCL context associated with <em>command_queue</em> and <em>buffer</em> must be the |
| same.</p> |
| </li> |
| <li> |
| <p><em>buffer</em> is a valid buffer object.</p> |
| </li> |
| <li> |
| <p><em>pattern</em> is a pointer to the data pattern of size <em>pattern_size</em> in bytes. |
| <em>pattern</em> will be used to fill a region in <em>buffer</em> starting at <em>offset</em> and |
| is <em>size</em> bytes in size. |
| The data pattern must be a scalar or vector integer or floating-point data |
| type supported by OpenCL as described in <a href="#scalar-data-types">Shared |
| Application Scalar Data Types</a> and <a href="#vector-data-types">Supported |
| Application Vector Data Types</a>. |
| For example, if <em>buffer</em> is to be filled with a pattern of <code>float4</code> values, |
| then <em>pattern</em> will be a pointer to a <code>cl_float4</code> value and <em>pattern_size</em> |
| will be <code>sizeof(cl_float4)</code>. |
| The maximum value of <em>pattern_size</em> is the size of the largest integer or |
| floating-point vector data type supported by the OpenCL device. |
| The memory associated with <em>pattern</em> can be reused or freed after the |
| function returns.</p> |
| </li> |
| <li> |
| <p><em>offset</em> is the location in bytes of the region being filled in <em>buffer</em> and |
| must be a multiple of <em>pattern_size</em>.</p> |
| </li> |
| <li> |
| <p><em>size</em> is the size in bytes of region being filled in <em>buffer</em> and must be a |
| multiple of <em>pattern_size</em>.</p> |
| </li> |
| <li> |
| <p><em>event_wait_list</em> and <em>num_events_in_wait_list</em> specify events that need to |
| complete before this particular command can be executed. |
| If <em>event_wait_list</em> is <code>NULL</code>, then this particular command does not wait |
| on any event to complete. |
| If <em>event_wait_list</em> is <code>NULL</code>, <em>num_events_in_wait_list</em> must be 0. |
| If <em>event_wait_list</em> is not <code>NULL</code>, the list of events pointed to by |
| <em>event_wait_list</em> must be valid and <em>num_events_in_wait_list</em> must be |
| greater than 0. |
| The events specified in <em>event_wait_list</em> act as synchronization points. |
| The context associated with events in <em>event_wait_list</em> and <em>command_queue</em> |
| must be the same. |
| The memory associated with <em>event_wait_list</em> can be reused or freed after |
| the function returns.</p> |
| </li> |
| <li> |
| <p><em>event</em> returns an event object that identifies this command |
| and can be used to query or queue a wait for this command to complete. |
| If <em>event</em> is <code>NULL</code> or the enqueue is unsuccessful, no event will be |
| created and therefore it will not be possible to query the status of this |
| command or to wait for this command to complete. |
| If <em>event_wait_list</em> and <em>event</em> are not <code>NULL</code>, <em>event</em> must not refer |
| to an element of the <em>event_wait_list</em> array.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The usage information which indicates whether the memory object can be read |
| or written by a kernel and/or the host and is given by the <code>cl_mem_<wbr>flags</code> |
| argument value specified when <em>buffer</em> is created is ignored by |
| <a href="#clEnqueueFillBuffer"><strong>clEnqueueFillBuffer</strong></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clEnqueueFillBuffer"><strong>clEnqueueFillBuffer</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid host |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if the context associated with <em>command_queue</em> and |
| <em>buffer</em> are not the same or if the context associated with |
| <em>command_queue</em> and events in <em>event_wait_list</em> are not the same.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>buffer</em> is not a valid buffer object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>offset</em> or <em>offset</em> + <em>size</em> require accessing |
| elements outside the <em>buffer</em> buffer object respectively.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>pattern</em> is <code>NULL</code> or if <em>pattern_size</em> is 0 or if |
| <em>pattern_size</em> is not one of { 1, 2, 4, 8, 16, 32, 64, 128 }.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>offset</em> and <em>size</em> are not a multiple of |
| <em>pattern_size</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_EVENT_WAIT_LIST"><code>CL_INVALID_<wbr>EVENT_<wbr>WAIT_<wbr>LIST</code></a> if <em>event_wait_list</em> is <code>NULL</code> and |
| <em>num_events_in_wait_list</em> > 0, or <em>event_wait_list</em> is not <code>NULL</code> and |
| <em>num_events_in_wait_list</em> is 0, or if event objects in <em>event_wait_list</em> |
| are not valid events.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>buffer</em> is a sub-buffer object and |
| offset specified when the sub-buffer object is created is not aligned to |
| <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for device associated with <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for data store associated with <em>buffer</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_mapping_buffer_objects"><a class="anchor" href="#_mapping_buffer_objects"></a>5.2.4. Mapping Buffer Objects</h4> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To enqueue a command to map a region of the buffer object given by <em>buffer</em> |
| into the host address space and returns a pointer to this mapped region, |
| call the function</p> |
| </div> |
| <div id="clEnqueueMapBuffer" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++"><span class="directive">void</span>* clEnqueueMapBuffer( |
| cl_command_queue command_queue, |
| cl_mem buffer, |
| cl_bool blocking_map, |
| cl_map_flags map_flags, |
| size_t offset, |
| size_t size, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> must be a valid host command-queue.</p> |
| </li> |
| <li> |
| <p><em>blocking_map</em> indicates if the map operation is <em>blocking</em> or |
| <em>non-blocking</em>.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_map</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> does not return until the |
| specified region in <em>buffer</em> is mapped into the host address space and the |
| application can access the contents of the mapped region using the pointer |
| returned by <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_map</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a> i.e. map operation is non-blocking, the |
| pointer to the mapped region returned by <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> cannot be used |
| until the map command has completed. |
| The <em>event</em> argument returns an event object which can be used to query the |
| execution status of the map command. |
| When the map command is completed, the application can access the contents |
| of the mapped region using the pointer returned by <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a>.</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>map_flags</em> is a bit-field and is described in the |
| <a href="#memory-map-flags-table">Memory Map Flags</a> table.</p> |
| </li> |
| <li> |
| <p><em>buffer</em> is a valid buffer object. |
| The OpenCL context associated with <em>command_queue</em> and <em>buffer</em> must be the |
| same.</p> |
| </li> |
| <li> |
| <p><em>offset</em> and <em>size</em> are the offset in bytes and the size of the region in |
| the buffer object that is being mapped.</p> |
| </li> |
| <li> |
| <p><em>event_wait_list</em> and <em>num_events_in_wait_list</em> specify events that need to |
| complete before this particular command can be executed. |
| If <em>event_wait_list</em> is <code>NULL</code>, then this particular command does not wait |
| on any event to complete. |
| If <em>event_wait_list</em> is <code>NULL</code>, <em>num_events_in_wait_list</em> must be 0. |
| If <em>event_wait_list</em> is not <code>NULL</code>, the list of events pointed to by |
| <em>event_wait_list</em> must be valid and <em>num_events_in_wait_list</em> must be |
| greater than 0. |
| The events specified in <em>event_wait_list</em> act as synchronization points. |
| The context associated with events in <em>event_wait_list</em> and <em>command_queue</em> |
| must be the same. |
| The memory associated with <em>event_wait_list</em> can be reused or freed after |
| the function returns.</p> |
| </li> |
| <li> |
| <p><em>event</em> returns an event object that identifies this command |
| and can be used to query or queue a wait for this command to complete. |
| If <em>event</em> is <code>NULL</code> or the enqueue is unsuccessful, no event will be |
| created and therefore it will not be possible to query the status of this |
| command or to wait for this command to complete. |
| If <em>event_wait_list</em> and <em>event</em> are not <code>NULL</code>, <em>event</em> must not refer |
| to an element of the <em>event_wait_list</em> array.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> will return a pointer to the mapped region. |
| The <em>errcode_ret</em> is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>A <code>NULL</code> pointer is returned otherwise with one of the following error |
| values returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid host |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if context associated with <em>command_queue</em> and |
| <em>buffer</em> are not the same or if the context associated with |
| <em>command_queue</em> and events in <em>event_wait_list</em> are not the same.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>buffer</em> is not a valid buffer object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if region being mapped given by (<em>offset</em>, <em>size</em>) is |
| out of bounds or if <em>size</em> is 0 or if values specified in <em>map_flags</em> |
| are not valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_EVENT_WAIT_LIST"><code>CL_INVALID_<wbr>EVENT_<wbr>WAIT_<wbr>LIST</code></a> if <em>event_wait_list</em> is <code>NULL</code> and |
| <em>num_events_in_wait_list</em> > 0, or <em>event_wait_list</em> is not <code>NULL</code> and |
| <em>num_events_in_wait_list</em> is 0, or if event objects in <em>event_wait_list</em> |
| are not valid events.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MISALIGNED_SUB_BUFFER_OFFSET"><code>CL_MISALIGNED_<wbr>SUB_<wbr>BUFFER_<wbr>OFFSET</code></a> if <em>buffer</em> is a sub-buffer object and |
| <em>offset</em> specified when the sub-buffer object is created is not aligned |
| to <a href="#CL_DEVICE_MEM_BASE_ADDR_ALIGN"><code>CL_DEVICE_<wbr>MEM_<wbr>BASE_<wbr>ADDR_<wbr>ALIGN</code></a> value for the device associated with |
| <em>queue</em>. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MAP_FAILURE"><code>CL_MAP_<wbr>FAILURE</code></a> if there is a failure to map the requested region into |
| the host address space. |
| This error cannot occur for buffer objects created with |
| <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST"><code>CL_EXEC_<wbr>STATUS_<wbr>ERROR_<wbr>FOR_<wbr>EVENTS_<wbr>IN_<wbr>WAIT_<wbr>LIST</code></a> if the map operation is |
| blocking and the execution status of any of the events in |
| <em>event_wait_list</em> is a negative integer value. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for data store associated with <em>buffer</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <em>buffer</em> has been created with |
| <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> or <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a> and <a href="#CL_MAP_READ"><code>CL_MAP_<wbr>READ</code></a> is set |
| in <em>map_flags</em> or if <em>buffer</em> has been created with |
| <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> or <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a> and <a href="#CL_MAP_WRITE"><code>CL_MAP_<wbr>WRITE</code></a> or |
| <a href="#CL_MAP_WRITE_INVALIDATE_REGION"><code>CL_MAP_<wbr>WRITE_<wbr>INVALIDATE_<wbr>REGION</code></a> is set in <em>map_flags</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if mapping would lead to overlapping regions being |
| mapped for writing.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The pointer returned maps a region starting at <em>offset</em> and is at least |
| <em>size</em> bytes in size. |
| The result of a memory access outside this region is undefined.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If the buffer object is created with <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> set in <em>mem_flags</em>, |
| the following will be true:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The <em>host_ptr</em> specified in <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> or <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> |
| will contain the latest bits in the region being mapped when the |
| <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> command has completed.</p> |
| </li> |
| <li> |
| <p>The pointer value returned by <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> will be derived from |
| the <em>host_ptr</em> specified when the buffer object is created.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Mapped buffer objects are unmapped using <a href="#clEnqueueUnmapMemObject"><strong>clEnqueueUnmapMemObject</strong></a>. |
| This is described in <a href="#unmapping-mapped-memory">Unmapping Mapped Memory |
| Objects</a>.</p> |
| </div> |
| <table id="memory-map-flags-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 14. List of supported map flag values</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Map Flags</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MAP_READ"></a><a href="#CL_MAP_READ"><code>CL_MAP_<wbr>READ</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the region being mapped in the memory object is |
| being mapped for reading.</p> |
| <p class="tableblock"> The pointer returned by <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> (<a href="#clEnqueueMapImage"><strong>clEnqueueMapImage</strong></a>) is |
| guaranteed to contain the latest bits in the region being mapped when |
| the <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> (<a href="#clEnqueueMapImage"><strong>clEnqueueMapImage</strong></a>) command has completed.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MAP_WRITE"></a><a href="#CL_MAP_WRITE"><code>CL_MAP_<wbr>WRITE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the region being mapped in the memory object is |
| being mapped for writing.</p> |
| <p class="tableblock"> The pointer returned by <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> (<a href="#clEnqueueMapImage"><strong>clEnqueueMapImage</strong></a>) is |
| guaranteed to contain the latest bits in the region being mapped when |
| the <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> (<a href="#clEnqueueMapImage"><strong>clEnqueueMapImage</strong></a>) command has completed</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MAP_WRITE_INVALIDATE_REGION"></a><a href="#CL_MAP_WRITE_INVALIDATE_REGION"><code>CL_MAP_<wbr>WRITE_<wbr>INVALIDATE_<wbr>REGION</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">This flag specifies that the region being mapped in the memory object is |
| being mapped for writing.</p> |
| <p class="tableblock"> The contents of the region being mapped are to be discarded. |
| This is typically the case when the region being mapped is overwritten |
| by the host. |
| This flag allows the implementation to no longer guarantee that the |
| pointer returned by <a href="#clEnqueueMapBuffer"><strong>clEnqueueMapBuffer</strong></a> (<a href="#clEnqueueMapImage"><strong>clEnqueueMapImage</strong></a>) contains |
| the latest bits in the region being mapped which can be a significant |
| performance enhancement.</p> |
| <p class="tableblock"> <a href="#CL_MAP_READ"><code>CL_MAP_<wbr>READ</code></a> or <a href="#CL_MAP_WRITE"><code>CL_MAP_<wbr>WRITE</code></a> and <a href="#CL_MAP_WRITE_INVALIDATE_REGION"><code>CL_MAP_<wbr>WRITE_<wbr>INVALIDATE_<wbr>REGION</code></a> are |
| mutually exclusive.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_image_objects"><a class="anchor" href="#_image_objects"></a>5.3. Image Objects</h3> |
| <div class="paragraph"> |
| <p>An <em>image</em> object is used to store a one-, two- or three-dimensional |
| texture, frame-buffer or image. |
| The elements of an image object are selected from a list of predefined image |
| formats. |
| The minimum number of elements in a memory object is one.</p> |
| </div> |
| <div class="sect3"> |
| <h4 id="_creating_image_objects"><a class="anchor" href="#_creating_image_objects"></a>5.3.1. Creating Image Objects</h4> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>An <strong>image object</strong> may be created using the function</p> |
| </div> |
| <div id="clCreateImage" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_mem clCreateImage( |
| cl_context context, |
| cl_mem_flags flags, |
| <span class="directive">const</span> cl_image_format* image_format, |
| <span class="directive">const</span> cl_image_desc* image_desc, |
| <span class="directive">void</span>* host_ptr, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateImage"><strong>clCreateImage</strong></a> is <a href="#unified-spec">missing before</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="paragraph"> |
| <p>An <strong>image object</strong> may also be created with additional properties using the function</p> |
| </div> |
| <div id="clCreateImageWithProperties" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_mem clCreateImageWithProperties( |
| cl_context context, |
| <span class="directive">const</span> cl_mem_properties* properties, |
| cl_mem_flags flags, |
| <span class="directive">const</span> cl_image_format* image_format, |
| <span class="directive">const</span> cl_image_desc* image_desc, |
| <span class="directive">void</span>* host_ptr, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateImageWithProperties"><strong>clCreateImageWithProperties</strong></a> is <a href="#unified-spec">missing before</a> version 3.0. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> is a valid OpenCL context used to create the image object.</p> |
| </li> |
| <li> |
| <p><em>properties</em> is an optional list of properties for the image object and their corresponding values. |
| The list is terminated with the special property <code>0</code>. |
| If no properties are required, <em>properties</em> may be <code>NULL</code>. |
| OpenCL 3.0 does not define any optional properties for images.</p> |
| </li> |
| <li> |
| <p><em>flags</em> is a bit-field that is used to specify allocation and usage |
| information about the image memory object being created and is described in |
| the <a href="#memory-flags-table">supported memory flag values</a> table.</p> |
| </li> |
| <li> |
| <p><em>image_format</em> is a pointer to a structure that describes format properties |
| of the image to be allocated. |
| A 1D image buffer or 2D image can be created from a buffer by specifying a |
| buffer object in the <em>image_desc</em>→<em>mem_object</em>. |
| A 2D image can be created from another 2D image object by specifying an |
| image object in the <em>image_desc</em>→<em>mem_object</em>. |
| Refer to the <a href="#image-format-descriptor">Image Format Descriptor</a> section |
| for a detailed description of the image format descriptor.</p> |
| </li> |
| <li> |
| <p><em>image_desc</em> is a pointer to a structure that describes type and dimensions |
| of the image to be allocated. |
| Refer to the <a href="#image-descriptor">Image Descriptor</a> section for a detailed |
| description of the image descriptor.</p> |
| </li> |
| <li> |
| <p><em>host_ptr</em> is a pointer to the image data that may already be allocated by |
| the application. |
| Refer to the <a href="#host-ptr-buffer-size-table">table below</a> for a description |
| of how large the buffer that <em>host_ptr</em> points to must be.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>The alignment requirements for data stored in image objects are described |
| in <a href="#alignment-app-data-types">Alignment of Application Data Types</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For all image types except <a href="#CL_MEM_OBJECT_IMAGE1D_BUFFER"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>BUFFER</code></a>, if the value |
| specified for <em>flags</em> is 0, the default is used which is <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For <a href="#CL_MEM_OBJECT_IMAGE1D_BUFFER"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>BUFFER</code></a> image type, or an image created from |
| another memory object (image or buffer), if the <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>, |
| <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a> or <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> values are not specified in <em>flags</em>, |
| they are inherited from the corresponding memory access qualifiers associated |
| with <em>mem_object</em>. |
| The <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, <a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a> and <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> |
| values cannot be specified in <em>flags</em> but are inherited from the |
| corresponding memory access qualifiers associated with <em>mem_object</em>. |
| If <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> is specified in the memory access qualifier values |
| associated with <em>mem_object</em> it does not imply any additional copies when |
| the image is created from <em>mem_object</em>. |
| If the <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a>, <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> or |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a> values are not specified in <em>flags</em>, they are |
| inherited from the corresponding memory access qualifiers associated with |
| <em>mem_object</em>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For a 3D image or 2D image array, the image data specified by <em>host_ptr</em> is |
| stored as a linear sequence of adjacent 2D image slices or 2D images |
| respectively. |
| Each 2D image is a linear sequence of adjacent scanlines. |
| Each scanline is a linear sequence of image elements.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For a 2D image, the image data specified by <em>host_ptr</em> is stored as a linear |
| sequence of adjacent scanlines. |
| Each scanline is a linear sequence of image elements.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For a 1D image array, the image data specified by <em>host_ptr</em> is stored as a |
| linear sequence of adjacent 1D images. |
| Each 1D image is stored as a single scanline which is a linear sequence of |
| adjacent elements.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For 1D image or 1D image buffer, the image data specified by <em>host_ptr</em> is |
| stored as a single scanline which is a linear sequence of adjacent elements.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Image elements are stored according to their image format as described in the |
| <a href="#image-format-descriptor">Image Format Descriptor</a> section.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateImage"><strong>clCreateImage</strong></a> and <a href="#clCreateImageWithProperties"><strong>clCreateImageWithProperties</strong></a> returns a valid non-zero |
| image object and <em>errcode_ret</em> is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the image object |
| is created successfully. |
| Otherwise, they return a <code>NULL</code> value with one of the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_PROPERTY"><code>CL_INVALID_<wbr>PROPERTY</code></a> if a property name in <em>properties</em> is not a |
| supported property name, if the value specified for a supported property |
| name is not valid, or if the same property name is specified more than |
| once.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>flags</em> are not valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"><code>CL_INVALID_<wbr>IMAGE_<wbr>FORMAT_<wbr>DESCRIPTOR</code></a> if values specified in <em>image_format</em> |
| are not valid or if <em>image_format</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"><code>CL_INVALID_<wbr>IMAGE_<wbr>FORMAT_<wbr>DESCRIPTOR</code></a> if a 2D image is created from a |
| buffer and the row pitch and base address alignment does not follow the |
| rules described for creating a 2D image from a buffer.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"><code>CL_INVALID_<wbr>IMAGE_<wbr>FORMAT_<wbr>DESCRIPTOR</code></a> if a 2D image is created from a 2D |
| image object and the rules described above are not followed.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_DESCRIPTOR"><code>CL_INVALID_<wbr>IMAGE_<wbr>DESCRIPTOR</code></a> if values specified in <em>image_desc</em> are not |
| valid or if <em>image_desc</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_SIZE"><code>CL_INVALID_<wbr>IMAGE_<wbr>SIZE</code></a> if image dimensions specified in <em>image_desc</em> |
| exceed the maximum image dimensions described in the |
| <a href="#device-queries-table">Device Queries</a> table for all devices |
| in <em>context</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_HOST_PTR"><code>CL_INVALID_<wbr>HOST_<wbr>PTR</code></a> if <em>host_ptr</em> is <code>NULL</code> and <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> or |
| <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> are set in <em>flags</em> or if <em>host_ptr</em> is not <code>NULL</code> |
| but <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> are not set in <em>flags</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if an image is being created from another memory object |
| (buffer or image) under one of the following circumstances: 1) |
| <em>mem_object</em> was created with <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> and <em>flags</em> specifies |
| <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a> or <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a>, 2) <em>mem_object</em> was created with |
| <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a> and <em>flags</em> specifies <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a> or |
| <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a>, 3) <em>flags</em> specifies <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> or |
| <a href="#CL_MEM_ALLOC_HOST_PTR"><code>CL_MEM_<wbr>ALLOC_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if an image is being created from another memory object |
| (buffer or image) and <em>mem_object</em> was created with |
| <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> and <em>flags</em> specifies <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a>, or |
| if <em>mem_object</em> was created with <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> and <em>flags</em> |
| specifies <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a>, or if <em>mem_object</em> was created with |
| <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a> and_flags_ specifies <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> or |
| <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_IMAGE_FORMAT_NOT_SUPPORTED"><code>CL_IMAGE_<wbr>FORMAT_<wbr>NOT_<wbr>SUPPORTED</code></a> if there are no devices in <em>context</em> that |
| support <em>image_format</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for image object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if there are no devices in <em>context</em> that support |
| images (i.e. <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> specified in the |
| <a href="#device-queries-table">Device Queries</a> table is <a href="#CL_FALSE"><code>CL_FALSE</code></a>).</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="host-ptr-buffer-size-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 15. Required <em>host_ptr</em> buffer sizes for images</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Image Type</th> |
| <th class="tableblock halign-left valign-top">Size of buffer that <em>host_ptr</em> points to</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_OBJECT_IMAGE1D"></a><a href="#CL_MEM_OBJECT_IMAGE1D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">≥ image_row_pitch</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_OBJECT_IMAGE1D_BUFFER"></a><a href="#CL_MEM_OBJECT_IMAGE1D_BUFFER"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>BUFFER</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">≥ image_row_pitch</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_OBJECT_IMAGE2D"></a><a href="#CL_MEM_OBJECT_IMAGE2D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">≥ image_row_pitch × image_height</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_OBJECT_IMAGE3D"></a><a href="#CL_MEM_OBJECT_IMAGE3D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE3D</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">≥ image_slice_pitch × image_depth</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_OBJECT_IMAGE1D_ARRAY"></a><a href="#CL_MEM_OBJECT_IMAGE1D_ARRAY"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>ARRAY</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">≥ image_slice_pitch × image_array_size</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_MEM_OBJECT_IMAGE2D_ARRAY"></a><a href="#CL_MEM_OBJECT_IMAGE2D_ARRAY"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D_<wbr>ARRAY</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.2.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">≥ image_slice_pitch × image_array_size</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>A <strong>2D image</strong> object can be created using the following function</p> |
| </div> |
| <div id="clCreateImage2D" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_mem clCreateImage2D( |
| cl_context context, |
| cl_mem_flags flags, |
| <span class="directive">const</span> cl_image_format* image_format, |
| size_t image_width, |
| size_t image_height, |
| size_t image_row_pitch, |
| <span class="directive">void</span>* host_ptr, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateImage2D"><strong>clCreateImage2D</strong></a> is <a href="#unified-spec">deprecated by</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> is a valid OpenCL context on which the image object is to be |
| created.</p> |
| </li> |
| <li> |
| <p><em>flags</em> is a bit-field that is used to specify allocation and usage |
| information about the image memory object being created and is described in |
| the <a href="#memory-flags-table">supported memory flag values</a> table. |
| If the value specified for <em>flags</em> is 0, the default is used which is |
| <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>.</p> |
| </li> |
| <li> |
| <p><em>image_format</em> is a pointer to a structure that describes format properties |
| of the image to be allocated. |
| Refer to the <a href="#image-format-descriptor">Image Format Descriptor</a> section |
| for a detailed description of the image format descriptor.</p> |
| </li> |
| <li> |
| <p><em>image_width</em> and <em>image_height</em> are the width and height of the image in |
| pixels. |
| These must be values greater than or equal to 1.</p> |
| </li> |
| <li> |
| <p><em>image_row_pitch</em> is the scan-line pitch in bytes. |
| This must be 0 if <em>host_ptr</em> is <code>NULL</code> and can be either 0 or ≥ |
| <em>image_width</em> × size of element in bytes if <em>host_ptr</em> is not <code>NULL</code>. |
| If <em>host_ptr</em> is not <code>NULL</code> and <em>image_row_pitch</em> is 0, <em>image_row_pitch</em> |
| is calculated as <em>image_width</em> × size of element in bytes. |
| If <em>image_row_pitch</em> is not 0, it must be a multiple of the image element |
| size in bytes.</p> |
| </li> |
| <li> |
| <p><em>host_ptr</em> is a pointer to the image data that may already be allocated by |
| the application. |
| Refer to the <a href="#CL_MEM_OBJECT_IMAGE2D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D</code></a> entry in the |
| <a href="#host-ptr-buffer-size-table">required <em>host_ptr</em> buffer size table</a> for a |
| description of how large the buffer that <em>host_ptr</em> points to must be. |
| The image data specified by <em>host_ptr</em> is stored as a linear sequence of |
| adjacent scanlines. |
| Each scanline is a linear sequence of image elements. |
| Image elements are stored according to their image format as described in |
| the <a href="#image-format-descriptor">Image Format Descriptor</a> section.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateImage2D"><strong>clCreateImage2D</strong></a> returns a valid non-zero image object created and the |
| <em>errcode_ret</em> is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the image object is created |
| successfully. |
| Otherwise, it returns a <code>NULL</code> value with one of the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>flags</em> are not valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"><code>CL_INVALID_<wbr>IMAGE_<wbr>FORMAT_<wbr>DESCRIPTOR</code></a> if values specified in <em>image_format</em> |
| are not valid or if <em>image_format</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_SIZE"><code>CL_INVALID_<wbr>IMAGE_<wbr>SIZE</code></a> if <em>image_width</em> or <em>image_height</em> are 0 or if they |
| exceed the maximum values specified in <a href="#CL_DEVICE_IMAGE2D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>WIDTH</code></a> or |
| <a href="#CL_DEVICE_IMAGE2D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>HEIGHT</code></a> respectively for all devices in <em>context</em> or |
| if values specified by <em>image_row_pitch</em> do not follow rules described in the |
| argument description above.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_HOST_PTR"><code>CL_INVALID_<wbr>HOST_<wbr>PTR</code></a> if <em>host_ptr</em> is <code>NULL</code> and <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> or |
| <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> are set in <em>flags</em> or if <em>host_ptr</em> is not <code>NULL</code> |
| but <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> are not set in <em>flags</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_IMAGE_FORMAT_NOT_SUPPORTED"><code>CL_IMAGE_<wbr>FORMAT_<wbr>NOT_<wbr>SUPPORTED</code></a> if there are no devices in <em>context</em> that |
| support <em>image_format</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for image object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if there are no devices in <em>context</em> that support |
| images (i.e. <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> specified in the |
| <a href="#device-queries-table">Device Queries</a> table is <a href="#CL_FALSE"><code>CL_FALSE</code></a>).</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>A <strong>3D image</strong> object can be created using the following function</p> |
| </div> |
| <div id="clCreateImage3D" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_mem clCreateImage3D( |
| cl_context context, |
| cl_mem_flags flags, |
| <span class="directive">const</span> cl_image_format* image_format, |
| size_t image_width, |
| size_t image_height, |
| size_t image_depth, |
| size_t image_row_pitch, |
| size_t image_slice_pitch, |
| <span class="directive">void</span>* host_ptr, |
| cl_int* errcode_ret);</code></pre> |
| </div> |
| </div> |
| <div class="admonitionblock important"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-important" title="Important"></i> |
| </td> |
| <td class="content"> |
| <a href="#clCreateImage3D"><strong>clCreateImage3D</strong></a> is <a href="#unified-spec">deprecated by</a> version 1.2. |
| </td> |
| </tr> |
| </table> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> is a valid OpenCL context on which the image object is to be |
| created.</p> |
| </li> |
| <li> |
| <p><em>flags</em> is a bit-field that is used to specify allocation and usage |
| information about the image memory object being created and is described in |
| the <a href="#memory-flags-table">supported memory flag values</a> table. |
| If the value specified for <em>flags</em> is 0, the default is used which is |
| <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>.</p> |
| </li> |
| <li> |
| <p><em>image_format</em> is a pointer to a structure that describes format properties |
| of the image to be allocated. |
| Refer to the <a href="#image-format-descriptor">Image Format Descriptor</a> section |
| for a detailed description of the image format descriptor.</p> |
| </li> |
| <li> |
| <p><em>image_width</em> and <em>image_height</em> are the width and height of the image in |
| pixels. |
| These must be values greater than or equal to 1.</p> |
| </li> |
| <li> |
| <p><em>image_depth</em> is the depth of the image in pixels. For <a href="#clCreateImage3D"><strong>clCreateImage3D</strong></a>, |
| this must be a value > 1.</p> |
| </li> |
| <li> |
| <p><em>image_row_pitch</em> is the scan-line pitch in bytes. |
| This must be 0 if <em>host_ptr</em> is <code>NULL</code> and can be either 0 or ≥ |
| <em>image_width</em> × size of element in bytes if <em>host_ptr</em> is not <code>NULL</code>. |
| If <em>host_ptr</em> is not <code>NULL</code> and <em>image_row_pitch</em> is 0, <em>image_row_pitch</em> |
| is calculated as <em>image_width</em> × size of element in bytes. |
| If <em>image_row_pitch</em> is not 0, it must be a multiple of the image element |
| size in bytes.</p> |
| </li> |
| <li> |
| <p><em>image_slice_pitch</em> is the size in bytes of each 2D slice in the 3D image. |
| This be be 0 if <em>host_ptr</em> is <code>NULL</code> and can be 0 or ≥ |
| <em>image_row_pitch</em> × <em>image_height</em> if <em>host_ptr</em> is not <code>NULL</code>. |
| If <em>host_ptr</em> is not <code>NULL</code> and <em>image_slice_pitch</em> is 0, |
| <em>image_slice_pitch</em> is calculated as <em>image_row_pitch</em> × |
| <em>image_height</em>. |
| If <em>image_slice_pitch</em> is not 0, it must be a multiple of the |
| <em>image_row_pitch</em>.</p> |
| </li> |
| <li> |
| <p><em>host_ptr</em> is a pointer to the image data that may already be allocated by |
| the application. |
| Refer to the <a href="#CL_MEM_OBJECT_IMAGE3D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE3D</code></a> entry in the |
| <a href="#host-ptr-buffer-size-table">required <em>host_ptr</em> buffer size table</a> for a |
| description of how large the buffer that <em>host_ptr</em> points to must be. |
| The image data specified by <em>host_ptr</em> is stored as a linear sequence of |
| adjacent 2D slices. |
| Each scanline is a linear sequence of image elements. |
| Image elements are stored according to their image format as described in |
| the <a href="#image-format-descriptor">Image Format Descriptor</a> section.</p> |
| </li> |
| <li> |
| <p><em>errcode_ret</em> will return an appropriate error code. |
| If <em>errcode_ret</em> is <code>NULL</code>, no error code is returned.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clCreateImage3D"><strong>clCreateImage3D</strong></a> returns a valid non-zero image object created and the |
| <em>errcode_ret</em> is set to <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the image object is created |
| successfully. |
| Otherwise, it returns a <code>NULL</code> value with one of the following error values |
| returned in <em>errcode_ret</em>:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values specified in <em>flags</em> are not valid.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_FORMAT_DESCRIPTOR"><code>CL_INVALID_<wbr>IMAGE_<wbr>FORMAT_<wbr>DESCRIPTOR</code></a> if values specified in <em>image_format</em> |
| are not valid or if <em>image_format</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_SIZE"><code>CL_INVALID_<wbr>IMAGE_<wbr>SIZE</code></a> if <em>image_width</em> or <em>image_height</em> are 0 or if |
| <em>image_depth</em> ≤ 1, or if they exceed the maximum values specified in |
| <a href="#CL_DEVICE_IMAGE3D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>WIDTH</code></a>, <a href="#CL_DEVICE_IMAGE3D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>HEIGHT</code></a> or |
| <a href="#CL_DEVICE_IMAGE3D_MAX_DEPTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>DEPTH</code></a> respectively for all devices in <em>context</em>, or |
| if values specified by <em>image_row_pitch</em> and <em>image_slice_pitch</em> do not |
| follow rules described in the argument description above.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_HOST_PTR"><code>CL_INVALID_<wbr>HOST_<wbr>PTR</code></a> if <em>host_ptr</em> is <code>NULL</code> and <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> or |
| <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> are set in <em>flags</em> or if <em>host_ptr</em> is not <code>NULL</code> |
| but <a href="#CL_MEM_COPY_HOST_PTR"><code>CL_MEM_<wbr>COPY_<wbr>HOST_<wbr>PTR</code></a> or <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a> are not set in <em>flags</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_IMAGE_FORMAT_NOT_SUPPORTED"><code>CL_IMAGE_<wbr>FORMAT_<wbr>NOT_<wbr>SUPPORTED</code></a> if there are no devices in <em>context</em> that |
| support <em>image_format</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for image object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if there are no devices in <em>context</em> that support |
| images (i.e. <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> specified in the |
| <a href="#device-queries-table">Device Queries</a> table is <a href="#CL_FALSE"><code>CL_FALSE</code></a>).</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="image-format-descriptor"><a class="anchor" href="#image-format-descriptor"></a>5.3.1.1. Image Format Descriptor</h5> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The <a href="#cl_image_format"><code>cl_image_<wbr>format</code></a> image format descriptor structure describes an image |
| format, and is defined as:</p> |
| </div> |
| <div id="cl_image_format" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++"><span class="keyword">typedef</span> <span class="keyword">struct</span> cl_image_format { |
| cl_channel_order image_channel_order; |
| cl_channel_type image_channel_data_type; |
| } cl_image_format;</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>image_channel_order</code> specifies the number of channels and the channel |
| layout i.e. the memory layout in which channels are stored in the image. |
| Valid values are described in the <a href="#image-channel-order-table">Image Channel |
| Order</a> table.</p> |
| </li> |
| <li> |
| <p><code>image_channel_data_type</code> describes the size of the channel data type. |
| The list of supported values is described in the |
| <a href="#image-channel-data-types-table">Image Channel Data Types</a> table. |
| The number of bits per element determined by the <code>image_channel_data_type</code> |
| and <code>image_channel_order</code> must be a power of two.</p> |
| </li> |
| </ul> |
| </div> |
| <table id="image-channel-order-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 16. List of supported Image Channel Order Values</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Image Channel Order</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_R"></a><a href="#CL_R"><code>CL_R</code></a>, <a id="CL_A"></a><a href="#CL_A"><code>CL_A</code></a>,</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Single channel image formats where the single channel represents a <code>RED</code> or <code>ALPHA</code> component.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_DEPTH"></a><a href="#CL_DEPTH"><code>CL_DEPTH</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A single channel image format where the single channel represents a <code>DEPTH</code> component.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_LUMINANCE"></a><a href="#CL_LUMINANCE"><code>CL_LUMINANCE</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A single channel image format where the single channel represents a <code>LUMINANCE</code> value. |
| The <code>LUMINANCE</code> value is replicated into the <code>RED</code>, <code>GREEN</code>, and <code>BLUE</code> components.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_INTENSITY"></a><a href="#CL_INTENSITY"><code>CL_INTENSITY</code></a>,</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A single channel image format where the single channel represents an <code>INTENSITY</code> value. |
| The <code>INTENSITY</code> value is replicated into the <code>RED</code>, <code>GREEN</code>, <code>BLUE</code>, and <code>ALPHA</code> components.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_RG"></a><a href="#CL_RG"><code>CL_RG</code></a>, <a id="CL_RA"></a><a href="#CL_RA"><code>CL_RA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Two channel image formats. |
| The first channel always represents a <code>RED</code> component. |
| The second channel represents a <code>GREEN</code> component or an <code>ALPHA</code> component.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_Rx"></a><a href="#CL_Rx"><code>CL_Rx</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A two channel image format, where the first channel represents a <code>RED</code> component and the second channel is ignored.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_RGB"></a><a href="#CL_RGB"><code>CL_RGB</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A three channel image format, where the three channels represent <code>RED</code>, <code>GREEN</code>, and <code>BLUE</code> components.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_RGx"></a><a href="#CL_RGx"><code>CL_RGx</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A three channel image format, where the first two channels represent <code>RED</code> and <code>GREEN</code> components and the third channel is ignored.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_RGBA"></a><a href="#CL_RGBA"><code>CL_RGBA</code></a>, <a id="CL_ARGB"></a><a href="#CL_ARGB"><code>CL_ARGB</code></a>, <a id="CL_BGRA"></a><a href="#CL_BGRA"><code>CL_BGRA</code></a>, <a id="CL_ABGR"></a><a href="#CL_ABGR"><code>CL_ABGR</code></a></p> |
| <p class="tableblock"> <a href="#CL_ABGR"><code>CL_ABGR</code></a> is <a href="#unified-spec">missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Four channel image formats, where the four channels represent <code>RED</code>, <code>GREEN</code>, <code>BLUE</code>, and <code>ALPHA</code> components.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_RGBx"></a><a href="#CL_RGBx"><code>CL_RGBx</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 1.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A four channel image format, where the first three channels represent <code>RED</code>, <code>GREEN</code>, and <code>BLUE</code> components and the fourth channel is ignored.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_sRGB"></a><a href="#CL_sRGB"><code>CL_sRGB</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A three channel image format, where the three channels represent <code>RED</code>, <code>GREEN</code>, and <code>BLUE</code> components in the sRGB color space.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_sRGBA"></a><a href="#CL_sRGBA"><code>CL_sRGBA</code></a>, <a id="CL_sBGRA"></a><a href="#CL_sBGRA"><code>CL_sBGRA</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Four channel image formats, where the first three channels represent <code>RED</code>, <code>GREEN</code>, and <code>BLUE</code> components in the sRGB color space. |
| The fourth channel represents an <code>ALPHA</code> component.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_sRGBx"></a><a href="#CL_sRGBx"><code>CL_sRGBx</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.0.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A four channel image format, where the three channels represent <code>RED</code>, <code>GREEN</code>, and <code>BLUE</code> components in the sRGB color space. |
| The fourth channel is ignored.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <table id="image-channel-data-types-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 17. List of supported Image Channel Data Types</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Image Channel Data Type</th> |
| <th class="tableblock halign-left valign-top">Description</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_SNORM_INT8"></a><a href="#CL_SNORM_INT8"><code>CL_SNORM_<wbr>INT8</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is a normalized signed 8-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_SNORM_INT16"></a><a href="#CL_SNORM_INT16"><code>CL_SNORM_<wbr>INT16</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is a normalized signed 16-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNORM_INT8"></a><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is a normalized unsigned 8-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNORM_INT16"></a><a href="#CL_UNORM_INT16"><code>CL_UNORM_<wbr>INT16</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is a normalized unsigned 16-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNORM_SHORT_565"></a><a href="#CL_UNORM_SHORT_565"><code>CL_UNORM_<wbr>SHORT_<wbr>565</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Represents a normalized 5-6-5 3-channel RGB image. |
| The channel order must be <a href="#CL_RGB"><code>CL_RGB</code></a> or <a href="#CL_RGBx"><code>CL_RGBx</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNORM_SHORT_555"></a><a href="#CL_UNORM_SHORT_555"><code>CL_UNORM_<wbr>SHORT_<wbr>555</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Represents a normalized x-5-5-5 4-channel xRGB image. |
| The channel order must be <a href="#CL_RGB"><code>CL_RGB</code></a> or <a href="#CL_RGBx"><code>CL_RGBx</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNORM_INT_101010"></a><a href="#CL_UNORM_INT_101010"><code>CL_UNORM_<wbr>INT_<wbr>101010</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Represents a normalized x-10-10-10 4-channel xRGB image. |
| The channel order must be <a href="#CL_RGB"><code>CL_RGB</code></a> or <a href="#CL_RGBx"><code>CL_RGBx</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNORM_INT_101010_2"></a><a href="#CL_UNORM_INT_101010_2"><code>CL_UNORM_<wbr>INT_<wbr>101010_<wbr>2</code></a></p> |
| <p class="tableblock"><a href="#unified-spec">Missing before</a> version 2.1.</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Represents a normalized 10-10-10-2 four-channel RGBA image. |
| The channel order must be <a href="#CL_RGBA"><code>CL_RGBA</code></a>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_SIGNED_INT8"></a><a href="#CL_SIGNED_INT8"><code>CL_SIGNED_<wbr>INT8</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is an unnormalized signed 8-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_SIGNED_INT16"></a><a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is an unnormalized signed 16-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_SIGNED_INT32"></a><a href="#CL_SIGNED_INT32"><code>CL_SIGNED_<wbr>INT32</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is an unnormalized signed 32-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNSIGNED_INT8"></a><a href="#CL_UNSIGNED_INT8"><code>CL_UNSIGNED_<wbr>INT8</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is an unnormalized unsigned 8-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNSIGNED_INT16"></a><a href="#CL_UNSIGNED_INT16"><code>CL_UNSIGNED_<wbr>INT16</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is an unnormalized unsigned 16-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_UNSIGNED_INT32"></a><a href="#CL_UNSIGNED_INT32"><code>CL_UNSIGNED_<wbr>INT32</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is an unnormalized unsigned 32-bit integer value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_HALF_FLOAT"></a><a href="#CL_HALF_FLOAT"><code>CL_HALF_<wbr>FLOAT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is a 16-bit half-float value</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a id="CL_FLOAT"></a><a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Each channel component is a single precision floating-point value</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>For example, to specify a normalized unsigned 8-bit / channel RGBA image, |
| <code>image_channel_order</code> = <a href="#CL_RGBA"><code>CL_RGBA</code></a>, and <code>image_channel_data_type</code> = |
| <a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a>. |
| The memory layout of this image format is described below:</p> |
| </div> |
| <table class="tableblock frame-all grid-all" style="width: 60%;"> |
| <colgroup> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">R</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">G</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">B</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">…​</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>with the corresponding byte offsets</p> |
| </div> |
| <table class="tableblock frame-all grid-all" style="width: 60%;"> |
| <colgroup> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">3</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">…​</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>Similar, if <code>image_channel_order</code> = <a href="#CL_RGBA"><code>CL_RGBA</code></a> and <code>image_channel_data_type</code> = |
| <a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a>, the memory layout of this image format is described below:</p> |
| </div> |
| <table class="tableblock frame-all grid-all" style="width: 60%;"> |
| <colgroup> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">R</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">G</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">B</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">…​</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>with the corresponding byte offsets</p> |
| </div> |
| <table class="tableblock frame-all grid-all" style="width: 60%;"> |
| <colgroup> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 10%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">0</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">6</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">…​</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p><code>image_channel_data_type</code> values of <a href="#CL_UNORM_SHORT_565"><code>CL_UNORM_<wbr>SHORT_<wbr>565</code></a>, <a href="#CL_UNORM_SHORT_555"><code>CL_UNORM_<wbr>SHORT_<wbr>555</code></a>, |
| <a href="#CL_UNORM_INT_101010"><code>CL_UNORM_<wbr>INT_<wbr>101010</code></a>, and <a href="#CL_UNORM_INT_101010_2"><code>CL_UNORM_<wbr>INT_<wbr>101010_<wbr>2</code></a> are special cases of packed |
| image formats where the channels of each element are packed into a single |
| unsigned short or unsigned int. |
| For these special packed image formats, the channels are normally packed |
| with the first channel in the most significant bits of the bitfield, and |
| successive channels occupying progressively less significant locations. |
| For <a href="#CL_UNORM_SHORT_565"><code>CL_UNORM_<wbr>SHORT_<wbr>565</code></a>, R is in bits 15:11, G is in bits 10:5 and B is in |
| bits 4:0. |
| For <a href="#CL_UNORM_SHORT_555"><code>CL_UNORM_<wbr>SHORT_<wbr>555</code></a>, bit 15 is undefined, R is in bits 14:10, G in bits |
| 9:5 and B in bits 4:0. |
| For <a href="#CL_UNORM_INT_101010"><code>CL_UNORM_<wbr>INT_<wbr>101010</code></a>, bits 31:30 are undefined, R is in bits 29:20, G in |
| bits 19:10 and B in bits 9:0. |
| For <a href="#CL_UNORM_INT_101010_2"><code>CL_UNORM_<wbr>INT_<wbr>101010_<wbr>2</code></a>, R is in bits 31:22, G in bits 21:12, B in bits |
| 11:2 and A in bits 1:0.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL implementations must maintain the minimum precision specified by the |
| number of bits in <code>image_channel_data_type</code>. |
| If the image format specified by <code>image_channel_order</code>, and |
| <code>image_channel_data_type</code> cannot be supported by the OpenCL implementation, |
| then the call to <a href="#clCreateImage"><strong>clCreateImage</strong></a>, <a href="#clCreateImageWithProperties"><strong>clCreateImageWithProperties</strong></a>, |
| <a href="#clCreateImage2D"><strong>clCreateImage2D</strong></a>, or <a href="#clCreateImage3D"><strong>clCreateImage3D</strong></a> will return a <code>NULL</code> memory object.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="image-descriptor"><a class="anchor" href="#image-descriptor"></a>5.3.1.2. Image Descriptor</h5> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The <a href="#cl_image_desc"><code>cl_image_<wbr>desc</code></a> image descriptor structure describes the image type |
| and dimensions of an image or image array when creating an image using |
| <a href="#clCreateImage"><strong>clCreateImage</strong></a> or <a href="#clCreateImageWithProperties"><strong>clCreateImageWithProperties</strong></a>, and is defined as:</p> |
| </div> |
| <div id="cl_image_desc" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++"><span class="keyword">typedef</span> <span class="keyword">struct</span> cl_image_desc { |
| cl_mem_object_type image_type; |
| size_t image_width; |
| size_t image_height; |
| size_t image_depth; |
| size_t image_array_size; |
| size_t image_row_pitch; |
| size_t image_slice_pitch; |
| cl_uint num_mip_levels; |
| cl_uint num_samples; |
| <span class="keyword">union</span> { |
| cl_mem buffer; |
| cl_mem mem_object; |
| }; |
| } cl_image_desc;</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><code>image_type</code> describes the image type and must be either |
| <a href="#CL_MEM_OBJECT_IMAGE1D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D</code></a>, <a href="#CL_MEM_OBJECT_IMAGE1D_BUFFER"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>BUFFER</code></a>, |
| <a href="#CL_MEM_OBJECT_IMAGE1D_ARRAY"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>ARRAY</code></a>, <a href="#CL_MEM_OBJECT_IMAGE2D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D</code></a>, |
| <a href="#CL_MEM_OBJECT_IMAGE2D_ARRAY"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D_<wbr>ARRAY</code></a>, or <a href="#CL_MEM_OBJECT_IMAGE3D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE3D</code></a>.</p> |
| </li> |
| <li> |
| <p><code>image_width</code> is the width of the image in pixels. |
| For a 2D image and image array, the image width must be a value ≥ 1 and |
| ≤ <a href="#CL_DEVICE_IMAGE2D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>WIDTH</code></a>. |
| For a 3D image, the image width must be a value ≥ 1 and ≤ |
| <a href="#CL_DEVICE_IMAGE3D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>WIDTH</code></a>. |
| For a 1D image buffer, the image width must be a value ≥ 1 and ≤ |
| <a href="#CL_DEVICE_IMAGE_MAX_BUFFER_SIZE"><code>CL_DEVICE_<wbr>IMAGE_<wbr>MAX_<wbr>BUFFER_<wbr>SIZE</code></a>. |
| For a 1D image and 1D image array, the image width must be a value ≥ 1 |
| and ≤ <a href="#CL_DEVICE_IMAGE2D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>WIDTH</code></a>.</p> |
| </li> |
| <li> |
| <p><code>image_height</code> is the height of the image in pixels. |
| This is only used if the image is a 2D or 3D image, or a 2D image array. |
| For a 2D image or image array, the image height must be a value ≥ 1 and |
| ≤ <a href="#CL_DEVICE_IMAGE2D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>HEIGHT</code></a>. |
| For a 3D image, the image height must be a value ≥ 1 and ≤ |
| <a href="#CL_DEVICE_IMAGE3D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>HEIGHT</code></a>.</p> |
| </li> |
| <li> |
| <p><code>image_depth</code> is the depth of the image in pixels. |
| This is only used if the image is a 3D image and must be a value ≥ 1 and |
| ≤ <a href="#CL_DEVICE_IMAGE3D_MAX_DEPTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>DEPTH</code></a>.</p> |
| </li> |
| <li> |
| <p><code>image_array_size</code> <sup class="footnote">[<a id="_footnoteref_17" class="footnote" href="#_footnotedef_17" title="View footnote.">17</a>]</sup> is the number of |
| images in the image array. |
| This is only used if the image is a 1D or 2D image array. |
| The values for <code>image_array_size</code>, if specified, must be a value ≥ 1 and |
| ≤ <a href="#CL_DEVICE_IMAGE_MAX_ARRAY_SIZE"><code>CL_DEVICE_<wbr>IMAGE_<wbr>MAX_<wbr>ARRAY_<wbr>SIZE</code></a>.</p> |
| </li> |
| <li> |
| <p><code>image_row_pitch</code> is the scan-line pitch in bytes. |
| This must be 0 if <em>host_ptr</em> is <code>NULL</code> and can be either 0 or ≥ |
| <code>image_width</code> × size of element in bytes if <em>host_ptr</em> is not <code>NULL</code>. |
| If <em>host_ptr</em> is not <code>NULL</code> and <code>image_row_pitch</code> = 0, <code>image_row_pitch</code> is |
| calculated as <code>image_width</code> × size of element in bytes. |
| If <code>image_row_pitch</code> is not 0, it must be a multiple of the image element |
| size in bytes. |
| For a 2D image created from a buffer, the pitch specified (or computed if |
| pitch specified is 0) must be a multiple of the maximum of the |
| <a href="#CL_DEVICE_IMAGE_PITCH_ALIGNMENT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>PITCH_<wbr>ALIGNMENT</code></a> value for all devices in the context |
| associated with the buffer specified by <code>mem_object</code> that support images.</p> |
| </li> |
| <li> |
| <p><code>image_slice_pitch</code> is the size in bytes of each 2D slice in the 3D image or |
| the size in bytes of each image in a 1D or 2D image array. |
| This must be 0 if <em>host_ptr</em> is <code>NULL</code>. |
| If <em>host_ptr</em> is not <code>NULL</code>, <code>image_slice_pitch</code> can be either 0 or ≥ |
| <code>image_row_pitch</code> × <code>image_height</code> for a 2D image array or 3D image |
| and can be either 0 or ≥ <code>image_row_pitch</code> for a 1D image array. |
| If <em>host_ptr</em> is not <code>NULL</code> and <code>image_slice_pitch</code> = 0, <code>image_slice_pitch</code> |
| is calculated as <code>image_row_pitch</code> × <code>image_height</code> for a 2D image |
| array or 3D image and <code>image_row_pitch</code> for a 1D image array. |
| If <code>image_slice_pitch</code> is not 0, it must be a multiple of the |
| <code>image_row_pitch</code>.</p> |
| </li> |
| <li> |
| <p><code>num_mip_levels</code> and <code>num_samples</code> must be 0.</p> |
| </li> |
| <li> |
| <p><code>mem_object</code> may refer to a valid buffer or image memory object. |
| <code>mem_object</code> can be a buffer memory object if <code>image_type</code> is |
| <a href="#CL_MEM_OBJECT_IMAGE1D_BUFFER"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>BUFFER</code></a> or |
| <a href="#CL_MEM_OBJECT_IMAGE2D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D</code></a> <sup class="footnote">[<a id="_footnoteref_18" class="footnote" href="#_footnotedef_18" title="View footnote.">18</a>]</sup>. |
| <code>mem_object</code> can be an image object if <code>image_type</code> is |
| <a href="#CL_MEM_OBJECT_IMAGE2D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D</code></a> <sup class="footnote">[<a id="_footnoteref_19" class="footnote" href="#_footnotedef_19" title="View footnote.">19</a>]</sup>. |
| Otherwise it must be <code>NULL</code>. |
| The image pixels are taken from the memory objects data store. |
| When the contents of the specified memory objects data store are modified, |
| those changes are reflected in the contents of the image object and |
| vice-versa at corresponding synchronization points.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>For a 1D image buffer created from a buffer object, the <code>image_width</code> × |
| size of element in bytes must be ≤ size of the buffer object. |
| The image data in the buffer object is stored as a single scanline which is |
| a linear sequence of adjacent elements.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For a 2D image created from a buffer object, the <code>image_row_pitch</code> × |
| <code>image_height</code> must be ≤ size of the buffer object specified by |
| <code>mem_object</code>. |
| The image data in the buffer object is stored as a linear sequence of |
| adjacent scanlines. |
| Each scanline is a linear sequence of image elements padded to |
| <code>image_row_pitch</code> bytes.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For an image object created from another image object, the values specified |
| in the image descriptor except for <code>mem_object</code> must match the image |
| descriptor information associated with <code>mem_object</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Image elements are stored according to their image format as described in |
| <a href="#image-format-descriptor">Image Format Descriptor</a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If the buffer object specified by <code>mem_object</code> was created with |
| <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, the <em>host_ptr</em> specified to <a href="#clCreateBuffer"><strong>clCreateBuffer</strong></a> or |
| <a href="#clCreateBufferWithProperties"><strong>clCreateBufferWithProperties</strong></a> must be aligned to the maximum of the |
| <a href="#CL_DEVICE_IMAGE_BASE_ADDRESS_ALIGNMENT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>BASE_<wbr>ADDRESS_<wbr>ALIGNMENT</code></a> value for all devices in the |
| context associated with the buffer specified by <code>mem_object</code> that |
| support images.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Creating a 2D image object from another 2D image object creates a new |
| 2D image object that shares the image data store with <code>mem_object</code> but views |
| the pixels in the image with a different image channel order. |
| Restrictions are:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>All of the values specified in <em>image_desc</em> must match the image descriptor |
| information associated with <code>mem_object</code>, except for <code>mem_object</code>.</p> |
| </li> |
| <li> |
| <p>The image channel data type specified in <em>image_format</em> must match the |
| image channel data type associated with <code>mem_object</code>.</p> |
| </li> |
| <li> |
| <p>The image channel order specified in <em>image_format</em> must be compatible |
| with the image channel order associated with <code>mem_object</code>. |
| Compatible image channel orders |
| <sup class="footnote">[<a id="_footnoteref_20" class="footnote" href="#_footnotedef_20" title="View footnote.">20</a>]</sup> are:</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Image Channel Order in <em>image_format</em>:</th> |
| <th class="tableblock halign-left valign-top">Image Channel Order associated with <code>mem_object</code>:</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sBGRA"><code>CL_sBGRA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_BGRA"><code>CL_BGRA</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_BGRA"><code>CL_BGRA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sBGRA"><code>CL_sBGRA</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sRGBA"><code>CL_sRGBA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGBA"><code>CL_RGBA</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGBA"><code>CL_RGBA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sRGBA"><code>CL_sRGBA</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sRGB"><code>CL_sRGB</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGB"><code>CL_RGB</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGB"><code>CL_RGB</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sRGB"><code>CL_sRGB</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sRGBx"><code>CL_sRGBx</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGBx"><code>CL_RGBx</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGBx"><code>CL_RGBx</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sRGBx"><code>CL_sRGBx</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_DEPTH"><code>CL_DEPTH</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_R"><code>CL_R</code></a></p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="paragraph"> |
| <p>Concurrent reading from, writing to and copying between both a buffer object |
| and 1D image buffer or 2D image object associated with the buffer object is |
| undefined. |
| Only reading from both a buffer object and 1D image buffer or 2D image |
| object associated with the buffer object is defined.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Writing to an image created from a buffer and then reading from this buffer |
| in a kernel even if appropriate synchronization operations (such as a |
| barrier) are performed between the writes and reads is undefined. |
| Similarly, writing to the buffer and reading from the image created from |
| this buffer with appropriate synchronization between the writes and reads is |
| undefined.</p> |
| </div> |
| </td> |
| </tr> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_querying_list_of_supported_image_formats"><a class="anchor" href="#_querying_list_of_supported_image_formats"></a>5.3.2. Querying List of Supported Image Formats</h4> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>To get the list of image formats supported by an OpenCL implementation for a |
| specified context, image type, and allocation information, call the function</p> |
| </div> |
| <div id="clGetSupportedImageFormats" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clGetSupportedImageFormats( |
| cl_context context, |
| cl_mem_flags flags, |
| cl_mem_object_type image_type, |
| cl_uint num_entries, |
| cl_image_format* image_formats, |
| cl_uint* num_image_formats);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>context</em> is a valid OpenCL context on which the image object(s) will be |
| created.</p> |
| </li> |
| <li> |
| <p><em>flags</em> is a bit-field that is used to specify usage |
| information about the image formats being queried and is described in |
| the <a href="#memory-flags-table">Memory Flags</a> table. |
| <em>flags</em> may be <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a> to query image formats that may be read |
| from and written to by different kernel instances when correctly ordered by |
| event dependencies, or <a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a> to query image formats that may |
| be read from by a kernel, or <a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a> to query image formats that |
| may be written to by a kernel, or <a href="#CL_MEM_KERNEL_READ_AND_WRITE"><code>CL_MEM_<wbr>KERNEL_<wbr>READ_<wbr>AND_<wbr>WRITE</code></a> to query |
| image formats that may be both read from and written to by the same kernel |
| instance. |
| Please see <a href="#image-format-mapping">Image Format Mapping</a> for clarification.</p> |
| </li> |
| <li> |
| <p><em>image_type</em> describes the image type and must be either |
| <a href="#CL_MEM_OBJECT_IMAGE1D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D</code></a>, <a href="#CL_MEM_OBJECT_IMAGE1D_BUFFER"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>BUFFER</code></a>, <a href="#CL_MEM_OBJECT_IMAGE2D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D</code></a>, |
| <a href="#CL_MEM_OBJECT_IMAGE3D"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE3D</code></a>, <a href="#CL_MEM_OBJECT_IMAGE1D_ARRAY"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE1D_<wbr>ARRAY</code></a>, or |
| <a href="#CL_MEM_OBJECT_IMAGE2D_ARRAY"><code>CL_MEM_<wbr>OBJECT_<wbr>IMAGE2D_<wbr>ARRAY</code></a>.</p> |
| </li> |
| <li> |
| <p><em>num_entries</em> specifies the number of entries that can be returned in the |
| memory location given by <em>image_formats</em>.</p> |
| </li> |
| <li> |
| <p><em>image_formats</em> is a pointer to a memory location where the list of |
| supported image formats are returned. |
| Each entry describes a <a href="#cl_image_format"><code>cl_image_<wbr>format</code></a> structure supported by the OpenCL |
| implementation. |
| If <em>image_formats</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| <li> |
| <p><em>num_image_formats</em> is the actual number of supported image formats for a |
| specific <em>context</em> and values specified by <em>flags</em>. |
| If <em>num_image_formats</em> is <code>NULL</code>, it is ignored.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetSupportedImageFormats"><strong>clGetSupportedImageFormats</strong></a> returns a union of image formats supported by |
| all devices in the context.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clGetSupportedImageFormats"><strong>clGetSupportedImageFormats</strong></a> returns <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the function is executed |
| successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if <em>context</em> is not a valid context.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>flags</em> or <em>image_type</em> are not valid, or if |
| <em>num_entries</em> is 0 and <em>image_formats</em> is not <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> specified in the <a href="#device-queries-table">Device |
| Queries</a> table is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, the values assigned to |
| <a href="#CL_DEVICE_MAX_READ_IMAGE_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>READ_<wbr>IMAGE_<wbr>ARGS</code></a>, <a href="#CL_DEVICE_MAX_WRITE_IMAGE_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>WRITE_<wbr>IMAGE_<wbr>ARGS</code></a> |
| <a href="#CL_DEVICE_IMAGE2D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>WIDTH</code></a>, <a href="#CL_DEVICE_IMAGE2D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE2D_<wbr>MAX_<wbr>HEIGHT</code></a> |
| <a href="#CL_DEVICE_IMAGE3D_MAX_WIDTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>WIDTH</code></a>, <a href="#CL_DEVICE_IMAGE3D_MAX_HEIGHT"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>HEIGHT</code></a> |
| <a href="#CL_DEVICE_IMAGE3D_MAX_DEPTH"><code>CL_DEVICE_<wbr>IMAGE3D_<wbr>MAX_<wbr>DEPTH</code></a>, and <a href="#CL_DEVICE_MAX_SAMPLERS"><code>CL_DEVICE_<wbr>MAX_<wbr>SAMPLERS</code></a> by the implementation |
| must be greater than or equal to the minimum values specified in the |
| <a href="#device-queries-table">Device Queries</a> table.</p> |
| </div> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="minimum-list-of-supported-image-formats"><a class="anchor" href="#minimum-list-of-supported-image-formats"></a>5.3.2.1. Minimum List of Supported Image Formats</h5> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The tables below describe the required minimum lists of supported image |
| formats. |
| To query all image formats supported by an implementation, call the function <a href="#clGetSupportedImageFormats"><strong>clGetSupportedImageFormats</strong></a>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For full profile devices supporting OpenCL 2.0, 2.1, or 2.2, the minimum |
| list of supported image formats for either reading or writing in a kernel |
| is:</p> |
| </div> |
| <table id="min-supported-image-formats-2.0" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 18. Minimum list of supported image formats for reading or writing (OpenCL 2.0, 2.1, or 2.2)</caption> |
| <colgroup> |
| <col style="width: 34%;"> |
| <col style="width: 33%;"> |
| <col style="width: 33%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">num_channels</th> |
| <th class="tableblock halign-left valign-top">channel_order</th> |
| <th class="tableblock halign-left valign-top">channel_data_type</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_R"><code>CL_R</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_UNORM_INT16"><code>CL_UNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_SNORM_INT8"><code>CL_SNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_SNORM_INT16"><code>CL_SNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT8"><code>CL_SIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT32"><code>CL_SIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_UNSIGNED_INT8"><code>CL_UNSIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_UNSIGNED_INT16"><code>CL_UNSIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_UNSIGNED_INT32"><code>CL_UNSIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_HALF_FLOAT"><code>CL_HALF_<wbr>FLOAT</code></a><br> |
| <a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_DEPTH"><code>CL_DEPTH</code></a> <sup class="footnote">[<a id="_footnoteref_21" class="footnote" href="#_footnotedef_21" title="View footnote.">21</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT16"><code>CL_UNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">2</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RG"><code>CL_RG</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_UNORM_INT16"><code>CL_UNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_SNORM_INT8"><code>CL_SNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_SNORM_INT16"><code>CL_SNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT8"><code>CL_SIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT32"><code>CL_SIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_UNSIGNED_INT8"><code>CL_UNSIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_UNSIGNED_INT16"><code>CL_UNSIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_UNSIGNED_INT32"><code>CL_UNSIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_HALF_FLOAT"><code>CL_HALF_<wbr>FLOAT</code></a><br> |
| <a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGBA"><code>CL_RGBA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_UNORM_INT16"><code>CL_UNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_SNORM_INT8"><code>CL_SNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_SNORM_INT16"><code>CL_SNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT8"><code>CL_SIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT32"><code>CL_SIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_UNSIGNED_INT8"><code>CL_UNSIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_UNSIGNED_INT16"><code>CL_UNSIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_UNSIGNED_INT32"><code>CL_UNSIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_HALF_FLOAT"><code>CL_HALF_<wbr>FLOAT</code></a><br> |
| <a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_BGRA"><code>CL_BGRA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_sRGBA"><code>CL_sRGBA</code></a> <sup class="footnote">[<a id="_footnoteref_22" class="footnote" href="#_footnotedef_22" title="View footnote.">22</a>]</sup></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a></p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>For full profile devices supporting other OpenCL versions, such as OpenCL 1.2 |
| or OpenCL 3.0, the minimum list of supported image formats for either reading |
| or writing in a kernel is:</p> |
| </div> |
| <table id="min-supported-image-formats" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 19. Minimum list of required image formats for reading or writing</caption> |
| <colgroup> |
| <col style="width: 34%;"> |
| <col style="width: 33%;"> |
| <col style="width: 33%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">num_channels</th> |
| <th class="tableblock halign-left valign-top">channel_order</th> |
| <th class="tableblock halign-left valign-top">channel_data_type</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGBA"><code>CL_RGBA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_UNORM_INT16"><code>CL_UNORM_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT8"><code>CL_SIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT32"><code>CL_SIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_UNSIGNED_INT8"><code>CL_UNSIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_UNSIGNED_INT16"><code>CL_UNSIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_UNSIGNED_INT32"><code>CL_UNSIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_HALF_FLOAT"><code>CL_HALF_<wbr>FLOAT</code></a><br> |
| <a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_BGRA"><code>CL_BGRA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a></p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>For full profile devices that support reading from and writing to the same |
| image object from the same kernel instance (see <a href="#CL_DEVICE_MAX_READ_WRITE_IMAGE_ARGS"><code>CL_DEVICE_<wbr>MAX_<wbr>READ_<wbr>WRITE_<wbr>IMAGE_<wbr>ARGS</code></a>), |
| the minimum list of supported image formats for reading and writing in |
| the same kernel instance is:</p> |
| </div> |
| <table id="min-supported-image-formats-read-write" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 20. Minimum list of required image formats for reading and writing</caption> |
| <colgroup> |
| <col style="width: 34%;"> |
| <col style="width: 33%;"> |
| <col style="width: 33%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">num_channels</th> |
| <th class="tableblock halign-left valign-top">channel_order</th> |
| <th class="tableblock halign-left valign-top">channel_data_type</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_R"><code>CL_R</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT8"><code>CL_SIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT32"><code>CL_SIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_UNSIGNED_INT8"><code>CL_UNSIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_UNSIGNED_INT16"><code>CL_UNSIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_UNSIGNED_INT32"><code>CL_UNSIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_HALF_FLOAT"><code>CL_HALF_<wbr>FLOAT</code></a><br> |
| <a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">4</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_RGBA"><code>CL_RGBA</code></a></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_UNORM_INT8"><code>CL_UNORM_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT8"><code>CL_SIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_SIGNED_INT16"><code>CL_SIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_SIGNED_INT32"><code>CL_SIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_UNSIGNED_INT8"><code>CL_UNSIGNED_<wbr>INT8</code></a><br> |
| <a href="#CL_UNSIGNED_INT16"><code>CL_UNSIGNED_<wbr>INT16</code></a><br> |
| <a href="#CL_UNSIGNED_INT32"><code>CL_UNSIGNED_<wbr>INT32</code></a><br> |
| <a href="#CL_HALF_FLOAT"><code>CL_HALF_<wbr>FLOAT</code></a><br> |
| <a href="#CL_FLOAT"><code>CL_FLOAT</code></a></p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| <div class="sect4"> |
| <h5 id="image-format-mapping"><a class="anchor" href="#image-format-mapping"></a>5.3.2.2. Image format mapping to OpenCL kernel language image access qualifiers</h5> |
| <div class="paragraph"> |
| <p>Image arguments to kernels may have the <code>read_only</code>, <code>write_only</code> or |
| <code>read_write</code> qualifier. |
| Not all image formats supported by the device and platform are valid to be |
| passed to all of these access qualifiers. |
| For each access qualifier, only images whose format is in the list of |
| formats returned by <a href="#clGetSupportedImageFormats"><strong>clGetSupportedImageFormats</strong></a> with the given flag |
| arguments in the <a href="#image-format-mapping-table">Image Format Mapping</a> table |
| are permitted. |
| It is not valid to pass an image supporting writing as both a <code>read_only</code> |
| image and a <code>write_only</code> image parameter, or to a <code>read_write</code> image |
| parameter and any other image parameter.</p> |
| </div> |
| <table id="image-format-mapping-table" class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 21. Mapping from format flags passed to <a href="#clGetSupportedImageFormats">clGetSupportedImageFormats</a> to OpenCL kernel language image access qualifiers</caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top">Access Qualifier</th> |
| <th class="tableblock halign-left valign-top">Memory Flags</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>read_only</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_MEM_READ_ONLY"><code>CL_MEM_<wbr>READ_<wbr>ONLY</code></a>,<br> |
| <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>,<br> |
| <a href="#CL_MEM_KERNEL_READ_AND_WRITE"><code>CL_MEM_<wbr>KERNEL_<wbr>READ_<wbr>AND_<wbr>WRITE</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>write_only</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_MEM_WRITE_ONLY"><code>CL_MEM_<wbr>WRITE_<wbr>ONLY</code></a>,<br> |
| <a href="#CL_MEM_READ_WRITE"><code>CL_MEM_<wbr>READ_<wbr>WRITE</code></a>,<br> |
| <a href="#CL_MEM_KERNEL_READ_AND_WRITE"><code>CL_MEM_<wbr>KERNEL_<wbr>READ_<wbr>AND_<wbr>WRITE</code></a></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><code>read_write</code></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><a href="#CL_MEM_KERNEL_READ_AND_WRITE"><code>CL_MEM_<wbr>KERNEL_<wbr>READ_<wbr>AND_<wbr>WRITE</code></a></p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="_reading_writing_and_copying_image_objects"><a class="anchor" href="#_reading_writing_and_copying_image_objects"></a>5.3.3. Reading, Writing and Copying Image Objects</h4> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>The following functions enqueue commands to read from an image or image |
| array object to host memory or write to an image or image array object from |
| host memory.</p> |
| </div> |
| <div id="clEnqueueReadImage" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueReadImage( |
| cl_command_queue command_queue, |
| cl_mem image, |
| cl_bool blocking_read, |
| <span class="directive">const</span> size_t* origin, |
| <span class="directive">const</span> size_t* region, |
| size_t row_pitch, |
| size_t slice_pitch, |
| <span class="directive">void</span>* ptr, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div id="clEnqueueWriteImage" class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c++">cl_int clEnqueueWriteImage( |
| cl_command_queue command_queue, |
| cl_mem image, |
| cl_bool blocking_write, |
| <span class="directive">const</span> size_t* origin, |
| <span class="directive">const</span> size_t* region, |
| size_t input_row_pitch, |
| size_t input_slice_pitch, |
| <span class="directive">const</span> <span class="directive">void</span>* ptr, |
| cl_uint num_events_in_wait_list, |
| <span class="directive">const</span> cl_event* event_wait_list, |
| cl_event* event);</code></pre> |
| </div> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><em>command_queue</em> refers to the host command-queue in which the read / write |
| command will be queued. |
| <em>command_queue</em> and <em>image</em> must be created with the same OpenCL context.</p> |
| </li> |
| <li> |
| <p><em>image</em> refers to a valid image or image array object.</p> |
| </li> |
| <li> |
| <p><em>blocking_read</em> and <em>blocking_write</em> indicate if the read and write |
| operations are <em>blocking</em> or <em>non-blocking</em>.</p> |
| </li> |
| <li> |
| <p><em>origin</em> defines the (<em>x</em>, <em>y</em>, <em>z</em>) offset in pixels in the 1D, 2D or 3D |
| image, the (<em>x</em>, <em>y</em>) offset and the image index in the 2D image array or |
| the (<em>x</em>) offset and the image index in the 1D image array. |
| If <em>image</em> is a 2D image object, <em>origin</em>[2] must be 0. |
| If <em>image</em> is a 1D image or 1D image buffer object, <em>origin</em>[1] and |
| <em>origin</em>[2] must be 0. |
| If <em>image</em> is a 1D image array object, <em>origin</em>[2] must be 0. |
| If <em>image</em> is a 1D image array object, <em>origin</em>[1] describes the image index |
| in the 1D image array. |
| If <em>image</em> is a 2D image array object, <em>origin</em>[2] describes the image index |
| in the 2D image array.</p> |
| </li> |
| <li> |
| <p><em>region</em> defines the (<em>width</em>, <em>height</em>, <em>depth</em>) in pixels of the 1D, 2D or |
| 3D rectangle, the (<em>width</em>, <em>height</em>) in pixels of the 2D rectangle and the |
| number of images of a 2D image array or the (<em>width</em>) in pixels of the 1D |
| rectangle and the number of images of a 1D image array. |
| If <em>image</em> is a 2D image object, <em>region</em>[2] must be 1. |
| If <em>image</em> is a 1D image or 1D image buffer object, <em>region</em>[1] and |
| <em>region</em>[2] must be 1. |
| If <em>image</em> is a 1D image array object, <em>region</em>[2] must be 1. |
| The values in <em>region</em> cannot be 0.</p> |
| </li> |
| <li> |
| <p><em>row_pitch</em> in <a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> and <em>input_row_pitch</em> in |
| <a href="#clEnqueueWriteImage"><strong>clEnqueueWriteImage</strong></a> is the length of each row in bytes. |
| This value must be greater than or equal to the element size in bytes |
| × <em>width</em>. |
| If <em>row_pitch</em> (or <em>input_row_pitch</em>) is set to 0, the appropriate row pitch |
| is calculated based on the size of each element in bytes multiplied by |
| <em>width</em>.</p> |
| </li> |
| <li> |
| <p><em>slice_pitch</em> in <a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> and <em>input_slice_pitch</em> in |
| <a href="#clEnqueueWriteImage"><strong>clEnqueueWriteImage</strong></a> is the size in bytes of the 2D slice of the 3D region |
| of a 3D image or each image of a 1D or 2D image array being read or written |
| respectively. |
| This must be 0 if <em>image</em> is a 1D or 2D image. |
| Otherwise this value must be greater than or equal to <em>row_pitch</em> × |
| <em>height</em>. |
| If <em>slice_pitch</em> (or <em>input_slice_pitch</em>) is set to 0, the appropriate slice |
| pitch is calculated based on the <em>row_pitch</em> × <em>height</em>.</p> |
| </li> |
| <li> |
| <p><em>ptr</em> is the pointer to a buffer in host memory where image data is to be |
| read from or to be written to. |
| The alignment requirements for ptr are specified in |
| <a href="#alignment-app-data-types">Alignment of Application Data Types</a>.</p> |
| </li> |
| <li> |
| <p><em>event_wait_list</em> and <em>num_events_in_wait_list</em> specify events that need to |
| complete before this particular command can be executed. |
| If <em>event_wait_list</em> is <code>NULL</code>, then this particular command does not wait |
| on any event to complete. |
| If <em>event_wait_list</em> is <code>NULL</code>, <em>num_events_in_wait_list</em> must be 0. |
| If <em>event_wait_list</em> is not <code>NULL</code>, the list of events pointed to by |
| <em>event_wait_list</em> must be valid and <em>num_events_in_wait_list</em> must be |
| greater than 0. |
| The events specified in <em>event_wait_list</em> act as synchronization points. |
| The context associated with events in <em>event_wait_list</em> and <em>command_queue</em> |
| must be the same. |
| The memory associated with <em>event_wait_list</em> can be reused or freed after |
| the function returns.</p> |
| </li> |
| <li> |
| <p><em>event</em> returns an event object that identifies this read / write command |
| and can be used to query or queue a wait for this command to complete. |
| If <em>event</em> is <code>NULL</code> or the enqueue is unsuccessful, no event will be |
| created and therefore it will not be possible to query the status of this |
| command or to wait for this command to complete. |
| If <em>event_wait_list</em> and <em>event</em> are not <code>NULL</code>, <em>event</em> must not refer |
| to an element of the <em>event_wait_list</em> array.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_read</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a> i.e. the read command is blocking, |
| <a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> does not return until the buffer data has been read and |
| copied into memory pointed to by <em>ptr</em>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_read</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a> i.e. the read command is non-blocking, |
| <a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> queues a non-blocking read command and returns. |
| The contents of the buffer that <em>ptr</em> points to cannot be used until the |
| read command has completed. |
| The <em>event</em> argument returns an event object which can be used to query the |
| execution status of the read command. |
| When the read command has completed, the contents of the buffer that <em>ptr</em> |
| points to can be used by the application.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_write</em> is <a href="#CL_TRUE"><code>CL_TRUE</code></a>, the write command is blocking and does not |
| return until the command is complete, including transfer of the data. |
| The memory pointed to by <em>ptr</em> can be reused by the application after the |
| <a href="#clEnqueueWriteImage"><strong>clEnqueueWriteImage</strong></a> call returns.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If <em>blocking_write</em> is <a href="#CL_FALSE"><code>CL_FALSE</code></a>, the OpenCL implementation will use <em>ptr</em> to |
| perform a non-blocking write. |
| As the write is non-blocking the implementation can return immediately. |
| The memory pointed to by <em>ptr</em> cannot be reused by the application after the |
| call returns. |
| The <em>event</em> argument returns an event object which can be used to query the |
| execution status of the write command. |
| When the write command has completed, the memory pointed to by <em>ptr</em> can |
| then be reused by the application.</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> and <a href="#clEnqueueWriteImage"><strong>clEnqueueWriteImage</strong></a> return <a href="#CL_SUCCESS"><code>CL_SUCCESS</code></a> if the |
| function is executed successfully. |
| Otherwise, it returns one of the following errors:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p><a href="#CL_INVALID_COMMAND_QUEUE"><code>CL_INVALID_<wbr>COMMAND_<wbr>QUEUE</code></a> if <em>command_queue</em> is not a valid host |
| command-queue.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_CONTEXT"><code>CL_INVALID_<wbr>CONTEXT</code></a> if the context associated with <em>command_queue</em> and |
| <em>image</em> are not the same or if the context associated with |
| <em>command_queue</em> and events in <em>event_wait_list</em> are not the same.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_MEM_OBJECT"><code>CL_INVALID_<wbr>MEM_<wbr>OBJECT</code></a> if <em>image</em> is not a valid image object.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>origin</em> or <em>region</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if the region being read or written specified by |
| <em>origin</em> and <em>region</em> is out of bounds.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if values in <em>origin</em> and <em>region</em> do not follow rules |
| described in the argument description for <em>origin</em> and <em>region</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_VALUE"><code>CL_INVALID_<wbr>VALUE</code></a> if <em>ptr</em> is <code>NULL</code>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_EVENT_WAIT_LIST"><code>CL_INVALID_<wbr>EVENT_<wbr>WAIT_<wbr>LIST</code></a> if <em>event_wait_list</em> is <code>NULL</code> and |
| <em>num_events_in_wait_list</em> > 0, or <em>event_wait_list</em> is not <code>NULL</code> and |
| <em>num_events_in_wait_list</em> is 0, or if event objects in <em>event_wait_list</em> |
| are not valid events.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_IMAGE_SIZE"><code>CL_INVALID_<wbr>IMAGE_<wbr>SIZE</code></a> if image dimensions (image width, height, |
| specified or compute row and/or slice pitch) for <em>image</em> are not |
| supported by device associated with <em>queue</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_IMAGE_FORMAT_NOT_SUPPORTED"><code>CL_IMAGE_<wbr>FORMAT_<wbr>NOT_<wbr>SUPPORTED</code></a> if image format (image channel order and |
| data type) for <em>image</em> are not supported by device associated with |
| <em>queue</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_MEM_OBJECT_ALLOCATION_FAILURE"><code>CL_MEM_<wbr>OBJECT_<wbr>ALLOCATION_<wbr>FAILURE</code></a> if there is a failure to allocate |
| memory for data store associated with <em>image</em>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if the device associated with <em>command_queue</em> does |
| not support images (i.e. <a href="#CL_DEVICE_IMAGE_SUPPORT"><code>CL_DEVICE_<wbr>IMAGE_<wbr>SUPPORT</code></a> specified in the |
| <a href="#device-queries-table">Device Queries</a> table is <a href="#CL_FALSE"><code>CL_FALSE</code></a>).</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> is called on <em>image</em> which |
| has been created with <a href="#CL_MEM_HOST_WRITE_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>WRITE_<wbr>ONLY</code></a> or <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_INVALID_OPERATION"><code>CL_INVALID_<wbr>OPERATION</code></a> if <a href="#clEnqueueWriteImage"><strong>clEnqueueWriteImage</strong></a> is called on <em>image</em> which |
| has been created with <a href="#CL_MEM_HOST_READ_ONLY"><code>CL_MEM_<wbr>HOST_<wbr>READ_<wbr>ONLY</code></a> or <a href="#CL_MEM_HOST_NO_ACCESS"><code>CL_MEM_<wbr>HOST_<wbr>NO_<wbr>ACCESS</code></a>.</p> |
| </li> |
| <li> |
| <p><a href="#CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST"><code>CL_EXEC_<wbr>STATUS_<wbr>ERROR_<wbr>FOR_<wbr>EVENTS_<wbr>IN_<wbr>WAIT_<wbr>LIST</code></a> if the read and write |
| operations are blocking and the execution status of any of the events in |
| <em>event_wait_list</em> is a negative integer value. |
| This error code is <a href="#unified-spec">missing before</a> version 1.1.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_RESOURCES"><code>CL_OUT_<wbr>OF_<wbr>RESOURCES</code></a> if there is a failure to allocate resources required |
| by the OpenCL implementation on the device.</p> |
| </li> |
| <li> |
| <p><a href="#CL_OUT_OF_HOST_MEMORY"><code>CL_OUT_<wbr>OF_<wbr>HOST_<wbr>MEMORY</code></a> if there is a failure to allocate resources |
| required by the OpenCL implementation on the host.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="admonitionblock note"> |
| <table> |
| <tr> |
| <td class="icon"> |
| <i class="fa icon-note" title="Note"></i> |
| </td> |
| <td class="content"> |
| <div class="paragraph"> |
| <p>Calling <a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> to read a region of the <em>image</em> with the <em>ptr</em> |
| argument value set to <em>host_ptr</em> + (<em>origin</em>[2] × <em>image slice pitch</em> |
| + <em>origin</em>[1] × <em>image row pitch</em> + <em>origin</em>[0] × <em>bytes |
| per pixel</em>), where <em>host_ptr</em> is a pointer to the memory region specified |
| when the <em>image</em> being read is created with <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_<wbr>USE_<wbr>HOST_<wbr>PTR</code></a>, must meet |
| the following requirements in order to avoid undefined behavior:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>All commands that use this image object have finished execution before |
| the read command begins execution.</p> |
| </li> |
| <li> |
| <p>The <em>row_pitch</em> and <em>slice_pitch</em> argument values in |
| <a href="#clEnqueueReadImage"><strong>clEnqueueReadImage</strong></a> must be set to the image row pitch and slice pitch.</p> |
| </li> |
| <li> |
| <p>The image object is not mapped.</p> |
| </li> |
| <li> |
| <p>The image object is not used by any command-queue until the read command |
| has finished execution.</p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Calling <a href="#clEnqueueWriteImage"><strong>clEnqueueWriteImage</strong></a> to update the latest bits in a region of the |
| <em>image</em> with the <em>ptr</em> argument value set to <em>host_ptr</em> + (<em>origin</em>[2] |
| × <em>image slice pitch</em> + <em>origin</em>[1] × <em>image row pitch</em> + |
| <em>origin</em>[0] × <em>bytes per pixel</em>), where <em>host_ptr</em> is a pointer to the |
| memory region specified when the <em>image</em> being written is created with |
| <a href="#CL_MEM_USE_HOST_PTR"><code>CL_MEM_ |