| <!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™ Extension 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> Extension Specification</h1> |
| <div class="details"> |
| <span id="author" class="author">Khronos<sup>®</sup> OpenCL Working Group</span><br> |
| <span id="revnumber">version v3.0.1-Provisional,</span> |
| <span id="revdate">Mon, 27 Apr 2020 04:09:41 +0000</span> |
| <br><span id="revremark">from git branch: master commit: fafc202e2b6a80bd2276596227317696d76e1f63</span> |
| </div> |
| <div id="toc" class="toc2"> |
| <div id="toctitle">Table of Contents</div> |
| <ul class="sectlevel1"> |
| <li><a href="#extensions-overview">1. Extensions Overview</a></li> |
| <li><a href="#cl_khr_icd-opencl">2. Installable Client Drivers</a></li> |
| <li><a href="#cl_khr_byte_addressable_store">3. Byte Addressable Stores</a></li> |
| <li><a href="#cl_khr_3d_image_writes">4. Writing to 3D Image Objects</a></li> |
| <li><a href="#cl_khr_fp16">5. Half Precision Floating-Point</a></li> |
| <li><a href="#cl_khr_fp64">6. Double Precision Floating-Point</a></li> |
| <li><a href="#cl_khr_int32_atomics">7. 32-bit Atomics</a></li> |
| <li><a href="#cl_khr_int64_atomics">8. 64-bit Atomics</a></li> |
| <li><a href="#cl_khr_select_fprounding_mode">9. Selecting the Rounding Mode <strong>(DEPRECATED)</strong></a></li> |
| <li><a href="#cl_khr_gl_sharing">10. Creating an OpenCL Context from an OpenGL Context or Share Group</a></li> |
| <li><a href="#cl_khr_gl_sharing__memobjs">11. Creating OpenCL Memory Objects from OpenGL Objects</a></li> |
| <li><a href="#cl_khr_gl_event">12. Creating OpenCL Event Objects from OpenGL Sync Objects</a></li> |
| <li><a href="#cl_khr_d3d10_sharing">13. Creating OpenCL Memory Objects from Direct3D 10 Buffers and Textures</a></li> |
| <li><a href="#cl_khr_d3d11_sharing">14. Creating OpenCL Memory Objects from Direct3D 11 Buffers and Textures</a></li> |
| <li><a href="#cl_khr_dx9_media_sharing">15. Creating OpenCL Memory Objects from DirectX 9 Media Surfaces</a></li> |
| <li><a href="#cl_khr_depth_images">16. Depth Images</a></li> |
| <li><a href="#cl_khr_gl_depth_images">17. Sharing OpenGL and OpenGL ES Depth and Depth-Stencil Images</a></li> |
| <li><a href="#cl_khr_gl_msaa_sharing">18. Creating OpenCL Memory Objects from OpenGL MSAA Textures</a></li> |
| <li><a href="#cl_khr_egl_event">19. Creating OpenCL Event Objects from EGL Sync Objects</a></li> |
| <li><a href="#cl_khr_egl_image">20. Creating OpenCL Memory Objects from EGL Images</a></li> |
| <li><a href="#cl_khr_image2d_from_buffer">21. Creating a 2D Image From A Buffer</a></li> |
| <li><a href="#cl_khr_initialize_memory">22. Local and Private Memory Initialization</a></li> |
| <li><a href="#cl_khr_terminate_context">23. Terminating OpenCL contexts</a></li> |
| <li><a href="#cl_khr_spir">24. Standard Portable Intermediate Representation Binaries</a></li> |
| <li><a href="#cl_khr_il_program">25. Intermediate Language Programs</a></li> |
| <li><a href="#cl_khr_create_command_queue">26. Creating Command Queues with Properties</a></li> |
| <li><a href="#cl_khr_device_enqueue_local_arg_types">27. Device Enqueue Local Argument Types</a></li> |
| <li><a href="#cl_khr_subgroups">28. Subgroups</a></li> |
| <li><a href="#cl_khr_mipmap_image">29. Mipmaps</a></li> |
| <li><a href="#cl_khr_srgb_image_writes">30. sRGB Image Writes</a></li> |
| <li><a href="#cl_khr_priority_hints">31. Priority Hints</a></li> |
| <li><a href="#cl_khr_throttle_hints">32. Throttle Hints</a></li> |
| <li><a href="#cl_khr_subgroup_named_barrier">33. Named Barriers for Subgroups</a></li> |
| <li><a href="#cl_khr_extended_async_copies">34. Extended Async Copies (Provisional)</a></li> |
| <li><a href="#cl_khr_async_work_group_copy_fence">35. Async Work Group Copy Fence (Provisional)</a></li> |
| <li><a href="#spirv_extensions">36. Extensions to the OpenCL SPIR-V Environment</a></li> |
| <li><a href="#_extensions_promoted_to_core_features">Appendix A: Extensions Promoted to Core Features</a></li> |
| <li><a href="#_deprecated_extensions">Appendix B: Deprecated Extensions</a></li> |
| <li><a href="#_quick_reference">Appendix C: Quick Reference</a></li> |
| </ul> |
| </div> |
| </div> |
| <div id="content"> |
| <div id="preamble"> |
| <div class="sectionbody"> |
| <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> |
| </div> |
| <div class="sect1"> |
| <h2 id="extensions-overview">1. Extensions Overview</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This document describes the list of optional features supported by OpenCL. |
| Optional extensions are not required to be supported by a conformant OpenCL |
| implementation, but are expected to be widely available, and in some cases may define |
| functionality that is likely to be required in a future revision of the |
| OpenCL specification.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This document describes all extensions that have been approved by the OpenCL |
| working group. |
| It is a <em>unified</em> specification, meaning that the extensions described in this |
| document are not specific to a specific core OpenCL specification version.</p> |
| </div> |
| <div class="paragraph"> |
| <p>OpenCL extensions approved by the OpenCL working group may be <em>promoted</em> to |
| core features in later revisions of OpenCL. |
| When this occurs, the feature described by the extension specification |
| is merged into the core OpenCL specification. |
| The extension will continue to be documented in this specification, both for |
| backwards compatibility and for devices that wish to support the feature |
| but that are unable to support the newer core OpenCL version.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="naming-convention-for-optional-extensions">1.1. Naming Convention for Optional Extensions</h3> |
| <div class="paragraph"> |
| <p>OpenCL extensions approved by the OpenCL working group use the following |
| naming convention:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>A unique <em>name string</em> of the form <code>"<strong>cl_khr_<<em>name</em>></strong>"</code> is associated |
| with each extension. |
| If the extension is supported by an implementation, this string will be |
| present in the implementation’s <code>CL_PLATFORM_EXTENSIONS</code> string or |
| <code>CL_DEVICE_EXTENSIONS</code> string.</p> |
| </li> |
| <li> |
| <p>All API functions defined by the extension will have names of the form |
| <strong>cl<<em>function_name</em>>KHR</strong>.</p> |
| </li> |
| <li> |
| <p>All enumerants defined by the extension will have names of the form |
| <strong>CL_<<em>enum_name</em>>_KHR.</strong></p> |
| </li> |
| </ul> |
| </div> |
| <div class="paragraph"> |
| <p>Functions and enumerants defined by extensions that are promoted to |
| core features will have their <strong>KHR</strong> affix removed. |
| OpenCL implementations of such later revisions must also export the name |
| strings of promoted extensions in the <code>CL_PLATFORM_EXTENSIONS</code> or |
| <code>CL_DEVICE_EXTENSIONS</code> string, and support the <strong>KHR</strong>-affixed versions of |
| functions and enumerants as a transition aid.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Vendor extensions are strongly encouraged to follow a similar naming |
| convention:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>A unique <em>name string</em> of the form <code>"<strong>cl_<<em>vendor_name</em>>_<<em>name></em></strong>"</code> |
| is associated with each extension. |
| If the extension is supported by an implementation, this string will be |
| present in the implementation’s <code>CL_PLATFORM_EXTENSIONS</code> string or |
| <code>CL_DEVICE_EXTENSIONS</code> string.</p> |
| </li> |
| <li> |
| <p>All API functions defined by the vendor extension will have names of the |
| form <strong>cl<<em>function_name</em>><<em>vendor_name</em>></strong>.</p> |
| </li> |
| <li> |
| <p>All enumerants defined by the vendor extension will have names of the |
| form <strong>CL_<<em>enum_name</em>>_<<em>vendor_name</em>>.</strong></p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="compiler-directives-for-optional-extensions">1.2. Compiler Directives for Optional Extensions</h3> |
| <div class="paragraph"> |
| <p>The <strong>#pragma OPENCL EXTENSION</strong> directive controls the behavior of the OpenCL |
| compiler with respect to extensions. |
| The <strong>#pragma OPENCL EXTENSION</strong> directive is defined as:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="preprocessor">#pragma</span> OPENCL EXTENSION <extension_name> : <behavior> |
| <span class="preprocessor">#pragma</span> OPENCL EXTENSION all : <behavior></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>where <em>extension_name</em> is the name of the extension. |
| The <em>extension_name</em> will have names of the form <strong>cl_khr_<<em>name</em>></strong> for an |
| extension approved by the OpenCL working group and will have names of the |
| form <strong>cl_<<em>vendor_name</em>>_<<em>name</em>></strong> for vendor extensions. |
| The token <strong>all</strong> means that the behavior applies to all extensions supported |
| by the compiler. |
| The <em>behavior</em> can be set to one of the following values given by the table |
| below.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 25%;"> |
| <col style="width: 75%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>behavior</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>enable</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Behave as specified by the extension <em>extension_name</em>.</p> |
| <p class="tableblock"> Report an error on the <strong><code>#pragma OPENCL EXTENSION</code></strong> if the |
| <em>extension_name</em> is not supported, or if <strong>all</strong> is specified.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>disable</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Behave (including issuing errors and warnings) as if the extension |
| <em>extension_name</em> is not part of the language definition.</p> |
| <p class="tableblock"> If <strong>all</strong> is specified, then behavior must revert back to that of the |
| non-extended core version of the language being compiled to.</p> |
| <p class="tableblock"> Warn on the <strong><code>#pragma OPENCL EXTENSION</code></strong> if the extension <em>extension_name</em> |
| is not supported.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>The <strong><code>#pragma OPENCL EXTENSION</code></strong> directive is a simple, low-level mechanism |
| to set the behavior for each extension. |
| It does not define policies such as which combinations are appropriate; |
| those must be defined elsewhere. |
| The order of directives matter in setting the behavior for each extension. |
| Directives that occur later override those seen earlier. |
| The <strong>all</strong> variant sets the behavior for all extensions, overriding all |
| previously issued extension directives, but only if the <em>behavior</em> is set to |
| <strong>disable</strong>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The initial state of the compiler is as if the directive</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="preprocessor">#pragma</span> OPENCL EXTENSION all : disable</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>was issued, telling the compiler that all error and warning reporting must |
| be done according to this specification, ignoring any extensions.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Every extension which affects the OpenCL language semantics, syntax or adds |
| built-in functions to the language must create a preprocessor <code>#define</code> that |
| matches the extension name string. |
| This <code>#define</code> would be available in the language if and only if the |
| extension is supported on a given implementation.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>Example</strong>:</p> |
| </div> |
| <div class="paragraph"> |
| <p>An extension which adds the extension string <code>"cl_khr_3d_image_writes"</code> |
| should also add a preprocessor <code>#define</code> called <strong><code>cl_khr_3d_image_writes</code></strong>. |
| A kernel can now use this preprocessor <code>#define</code> to do something like:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="preprocessor">#ifdef</span> cl_khr_3d_image_writes |
| <span class="comment">// do something using the extension</span> |
| <span class="preprocessor">#else</span> |
| <span class="comment">// do something else or #error!</span> |
| <span class="preprocessor">#endif</span></code></pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="getting-opencl-api-extension-function-pointers">1.3. Getting OpenCL API Extension Function Pointers</h3> |
| <div class="paragraph"> |
| <p>The function |
| </p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="directive">void</span>* clGetExtensionFunctionAddressForPlatform(cl_platform_id platform, |
| <span class="directive">const</span> <span class="predefined-type">char</span> *funcname)</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>returns the address of the extension function named by <em>funcname</em> for a |
| given <em>platform</em> The pointer returned should be cast to a function pointer |
| type matching the extension function’s definition defined in the appropriate |
| extension specification and header file. |
| A return value of <code>NULL</code> indicates that the specified function does not |
| exist for the implementation or <em>platform</em> is not a valid platform. |
| A non-<code>NULL</code> return value for <strong>clGetExtensionFunctionAddressForPlatform</strong> |
| does not guarantee that an extension function is actually supported by the |
| platform. |
| The application must also make a corresponding query using |
| <strong>clGetPlatformInfo</strong>(platform, CL_PLATFORM_EXTENSIONS, …​) or |
| <strong>clGetDeviceInfo</strong>(device, CL_DEVICE_EXTENSIONS, …​) to determine if an |
| extension is supported by the OpenCL implementation.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Since there is no way to qualify the query with a |
| device, the function pointer returned must work for all implementations of |
| that extension on different devices for a platform. |
| The behavior of calling a device extension function on a device not |
| supporting that extension is undefined.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>clGetExtensionFunctionAddressForPlatform</strong> may not be be used to query for core |
| (non-extension) functions in OpenCL. |
| For extension functions that may be queried using |
| <strong>clGetExtensionFunctionAddressForPlatform</strong>, implementations may also choose to |
| export those functions statically from the object libraries |
| implementing those functions, however, portable applications cannot rely on |
| this behavior.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Function pointer typedefs must be declared for all extensions that add API |
| entrypoints. |
| These typedefs are a required part of the extension interface, to be |
| provided in an appropriate header (such as cl_ext.h if the extension is an |
| OpenCL extension, or cl_gl_ext.h if the extension is an OpenCL / OpenGL |
| sharing extension).</p> |
| </div> |
| <div class="paragraph"> |
| <p>The following convention must be followed for all extensions affecting the |
| host API:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="preprocessor">#ifndef</span> extension_name |
| <span class="preprocessor">#define</span> extension_name <span class="integer">1</span> |
| |
| <span class="comment">// all data typedefs, token #defines, prototypes, and</span> |
| <span class="comment">// function pointer typedefs for this extension</span> |
| |
| <span class="comment">// function pointer typedefs must use the</span> |
| <span class="comment">// following naming convention</span> |
| |
| <span class="keyword">typedef</span> CL_API_ENTRY return_type |
| (CL_API_CALL *clExtensionFunctionNameTAG_fn)(...); |
| |
| <span class="preprocessor">#endif</span> <span class="comment">// _extension_name_</span></code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>where <code>TAG</code> can be <code>KHR</code>, <code>EXT</code> or <code>vendor-specific</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Consider, for example, the <strong>cl_khr_gl_sharing</strong> extension. |
| This extension would add the following to cl_gl_ext.h:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="preprocessor">#ifndef</span> cl_khr_gl_sharing |
| <span class="preprocessor">#define</span> cl_khr_gl_sharing <span class="integer">1</span> |
| |
| <span class="comment">// all data typedefs, token #defines, prototypes, and</span> |
| <span class="comment">// function pointer typedefs for this extension</span> |
| <span class="preprocessor">#define</span> CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR -<span class="integer">1000</span> |
| <span class="preprocessor">#define</span> CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR <span class="hex">0x2006</span> |
| <span class="preprocessor">#define</span> CL_DEVICES_FOR_GL_CONTEXT_KHR <span class="hex">0x2007</span> |
| <span class="preprocessor">#define</span> CL_GL_CONTEXT_KHR <span class="hex">0x2008</span> |
| <span class="preprocessor">#define</span> CL_EGL_DISPLAY_KHR <span class="hex">0x2009</span> |
| <span class="preprocessor">#define</span> CL_GLX_DISPLAY_KHR <span class="hex">0x200A</span> |
| <span class="preprocessor">#define</span> CL_WGL_HDC_KHR <span class="hex">0x200B</span> |
| <span class="preprocessor">#define</span> CL_CGL_SHAREGROUP_KHR <span class="hex">0x200C</span> |
| |
| <span class="comment">// function pointer typedefs must use the</span> |
| <span class="comment">// following naming convention</span> |
| <span class="keyword">typedef</span> CL_API_ENTRY cl_int |
| (CL_API_CALL *clGetGLContextInfoKHR_fn)( |
| <span class="directive">const</span> cl_context_properties * <span class="comment">/* properties */</span>, |
| cl_gl_context_info <span class="comment">/* param_name */</span>, |
| size_t <span class="comment">/* param_value_size */</span>, |
| <span class="directive">void</span> * <span class="comment">/* param_value */</span>, |
| size_t * <span class="comment">/*param_value_size_ret*/</span>); |
| |
| <span class="preprocessor">#endif</span> <span class="comment">// cl_khr_gl_sharing</span></code></pre> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="cl_khr_icd-opencl">2. Installable Client Drivers</h2> |
| <div class="sectionbody"> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-overview">2.1. Overview</h3> |
| <div class="paragraph"> |
| <p>This section describes a platform extension which defines a simple mechanism |
| through which the Khronos OpenCL installable client driver loader (ICD |
| Loader) may expose multiple separate vendor installable client drivers |
| (Vendor ICDs) for OpenCL. |
| An application written against the ICD Loader will be able to access all |
| cl_platform_ids exposed by all vendor implementations with the ICD Loader |
| acting as a demultiplexor.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This is a platform extension, so if this extension is supported by an |
| implementation, the string <strong>cl_khr_icd</strong> will be present in the |
| <code>CL_PLATFORM_EXTENSIONS</code> string.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="_general_information">2.2. General information</h3> |
| <div class="sect3"> |
| <h4 id="_version_history">2.2.1. Version history</h4> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Date</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Version</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">2020-04-21</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1.0.0</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">First assigned version.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-inferring-vendors-from-function-call-arguments">2.3. Inferring Vendors from Function Call Arguments</h3> |
| <div class="paragraph"> |
| <p>At every OpenCL function call, the ICD Loader infers the vendor ICD function |
| to call from the arguments to the function. |
| An object is said to be ICD compatible if it is of the following structure:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c"><span class="keyword">struct</span> _cl_<object> |
| { |
| <span class="keyword">struct</span> _cl_icd_dispatch *dispatch; |
| <span class="comment">// ... remainder of internal data</span> |
| };</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p><object> is one of platform_id, device_id, context, command_queue, mem, |
| program, kernel, event, or sampler.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The structure <code>_cl_icd_dispatch</code> is a function pointer dispatch table which |
| is used to direct calls to a particular vendor implementation. |
| All objects created from ICD compatible objects must be ICD compatible.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The definition for <code>_cl_icd_dispatch</code> is provided along with the OpenCL |
| headers. Existing members can never be removed from that structure but new |
| members can be appended.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Functions which do not have an argument from which the vendor implementation |
| may be inferred have been deprecated and may be ignored.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-icd-data">2.4. ICD Data</h3> |
| <div class="paragraph"> |
| <p>A Vendor ICD is defined by two pieces of data:</p> |
| </div> |
| <div class="ulist"> |
| <ul> |
| <li> |
| <p>The Vendor ICD library specifies a library which contains the OpenCL |
| entry points for the vendor’s OpenCL implementation. |
| The vendor ICD’s library file name should include the vendor name, or a |
| vendor-specific implementation identifier.</p> |
| </li> |
| <li> |
| <p>The Vendor ICD extension suffix is a short string which specifies the |
| default suffix for extensions implemented only by that vendor. |
| The vendor suffix string is optional.</p> |
| </li> |
| </ul> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-icd-loader-vendor-enumeration-on-windows">2.5. ICD Loader Vendor Enumeration on Windows</h3> |
| <div class="paragraph"> |
| <p>To enumerate Vendor ICDs on Windows, the ICD Loader will first |
| scan for REG_SZ string values in the "Display Adapter" and |
| "Software Components" HKR registry keys. The exact registry |
| keys to scan should be obtained via PnP Configuration Manager |
| APIs, but will look like:</p> |
| </div> |
| <div class="paragraph"> |
| <p>For 64-bit ICDs:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Display Adapter GUID}\{Instance ID}\OpenCLDriverName, or |
| |
| HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Software Component GUID}\{Instance ID}\OpenCLDriverName</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>For 32-bit ICDs:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Display Adapter GUID}\{Instance ID}\OpenCLDriverNameWoW, or |
| |
| HKLM\SYSTEM\CurrentControlSet\Control\Class\ |
| {Software Component GUID}\{Instance ID}\OpenCLDriverNameWoW</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>These registry values contain the path to the Vendor ICD library. |
| For example, if the registry contains the value:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>[HKLM\SYSTEM\CurrentControlSet\Control\Class\{GUID}\{Instance}] |
| "OpenCLDriverName"="c:\\vendor a\\vndra_ocl.dll"</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Then the ICD Loader will open the Vendor ICD library:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>c:\vendor a\vndra_ocl.dll</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>The ICD Loader will also scan for REG_DWORD values in the registry |
| key:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>HKLM\SOFTWARE\Khronos\OpenCL\Vendors</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>For each registry value in this key which has data set to 0, the |
| ICD Loader will open the Vendor ICD library specified by the name |
| of the registry value.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For example, if the registry contains the value:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>[HKLM\SOFTWARE\Khronos\OpenCL\Vendors] |
| "c:\\vendor a\\vndra_ocl.dll"=dword:00000000</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Then the ICD will open the Vendor ICD library:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>c:\vendor a\vndra_ocl.dll</pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-icd-loader-vendor-enumeration-on-linux">2.6. ICD Loader Vendor Enumeration on Linux</h3> |
| <div class="paragraph"> |
| <p>To enumerate vendor ICDs on Linux, the ICD Loader scans the files in the |
| path <code>/etc/OpenCL/vendors</code>. |
| For each file in this path, the ICD Loader opens the file as a text file. |
| The expected format for the file is a single line of text which specifies |
| the Vendor ICD’s library. |
| The ICD Loader will attempt to open that file as a shared object using |
| dlopen(). |
| Note that the library specified may be an absolute path or just a file name.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For example, if the following file exists</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>/etc/OpenCL/vendors/VendorA.icd</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>and contains the text</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>libVendorAOpenCL.so</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>then the ICD Loader will load the library <code>libVendorAOpenCL.so</code>.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-icd-loader-vendor-enumeration-on-android">2.7. ICD Loader Vendor Enumeration on Android</h3> |
| <div class="paragraph"> |
| <p>To enumerate vendor ICDs on Android, the ICD Loader scans the files in the |
| path <code>/system/vendor/Khronos/OpenCL/vendors</code>. |
| For each file in this path, the ICD Loader opens the file as a text file. |
| The expected format for the file is a single line of text which specifies |
| the Vendor ICD’s library. |
| The ICD Loader will attempt to open that file as a shared object using |
| dlopen(). |
| Note that the library specified may be an absolute path or just a file name.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For example, if the following file exists</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>/system/vendor/Khronos/OpenCL/vendors/VendorA.icd</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>and contains the text</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>libVendorAOpenCL.so</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>then the ICD Loader will load the library <code>libVendorAOpenCL.so</code>.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-adding-a-vendor-library">2.8. Adding a Vendor Library</h3> |
| <div class="paragraph"> |
| <p>Upon successfully loading a Vendor ICD’s library, the ICD Loader queries the |
| following functions from the library: <strong>clIcdGetPlatformIDsKHR</strong>, |
| <strong>clGetPlatformInfo</strong>, and <strong>clGetExtensionFunctionAddress</strong> (note: |
| <strong>clGetExtensionFunctionAddress</strong> has been deprecated, but is still required |
| for the ICD loader). |
| If any of these functions are not present then the ICD Loader will close and |
| ignore the library.</p> |
| </div> |
| <div class="paragraph"> |
| <p>Next the ICD Loader queries available ICD-enabled platforms in the library |
| using <strong>clIcdGetPlatformIDsKHR</strong>. |
| For each of these platforms, the ICD Loader queries the platform’s extension |
| string to verify that <strong>cl_khr_icd</strong> is supported, then queries the platform’s |
| Vendor ICD extension suffix using <strong>clGetPlatformInfo</strong> with the value |
| CL_PLATFORM_ICD_SUFFIX_KHR.</p> |
| </div> |
| <div class="paragraph"> |
| <p>If any of these steps fail, the ICD Loader will ignore the Vendor ICD and |
| continue on to the next.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-new-procedures-and-functions">2.9. New Procedures and Functions</h3> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c">cl_int clIcdGetPlatformIDsKHR(cl_uint num_entries, |
| cl_platform_id *platforms, |
| cl_uint *num_platforms);</code></pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-new-tokens">2.10. New Tokens</h3> |
| <div class="paragraph"> |
| <p>Accepted as <em>param_name</em> to the function <strong>clGetPlatformInfo</strong>:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>CL_PLATFORM_ICD_SUFFIX_KHR</pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p>Returned by <strong>clGetPlatformIDs</strong> when no platforms are found:</p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre>CL_PLATFORM_NOT_FOUND_KHR</pre> |
| </div> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-additions-to-chapter-4">2.11. Additions to Chapter 4 of the OpenCL 2.2 Specification</h3> |
| <div class="paragraph"> |
| <p>In <em>section 4.1</em>, replace the description of the return values of |
| <strong>clGetPlatformIDs</strong> with:</p> |
| </div> |
| <div class="paragraph"> |
| <p>"clGetPlatformIDs* returns CL_SUCCESS if the function is executed |
| successfully and there are a non zero number of platforms available. |
| It returns CL_PLATFORM_NOT_FOUND_KHR if zero platforms are available. |
| It returns CL_INVALID_VALUE 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> |
| </div> |
| <div class="paragraph"> |
| <p>In <em>section 4.1</em>, add the following after the description of |
| <strong>clGetPlatformIDs</strong>:</p> |
| </div> |
| <div class="paragraph"> |
| <p>"The list of platforms accessible through the Khronos ICD Loader can be |
| obtained using the following function: |
| </p> |
| </div> |
| <div class="listingblock"> |
| <div class="content"> |
| <pre class="CodeRay highlight"><code data-lang="c">cl_int clIcdGetPlatformIDsKHR(cl_uint num_entries, |
| cl_platform_id *platforms, |
| cl_uint *num_platforms);</code></pre> |
| </div> |
| </div> |
| <div class="paragraph"> |
| <p><em>num_entries</em> is the number of cl_platform_id entries that can be added to |
| <em>platforms</em>. |
| If <em>platforms</em> is not <code>NULL</code>, then <em>num_entries</em> must be greater than zero.</p> |
| </div> |
| <div class="paragraph"> |
| <p><em>platforms</em> returns a list of OpenCL platforms available for access through |
| the Khronos ICD Loader. |
| The cl_platform_id values returned in <em>platforms</em> are ICD compatible and can |
| be used to identify a specific OpenCL platform. |
| If the <em>platforms</em> argument is <code>NULL</code>, then 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> |
| </div> |
| <div class="paragraph"> |
| <p><em>num_platforms</em> returns the number of OpenCL platforms available. |
| If <em>num_platforms</em> is <code>NULL</code>, then this argument is ignored.</p> |
| </div> |
| <div class="paragraph"> |
| <p><strong>clIcdGetPlatformIDsKHR</strong> returns CL_SUCCESS if the function is executed |
| successfully and there are a non zero number of platforms available. |
| It returns CL_PLATFORM_NOT_FOUND_KHR if zero platforms are available. |
| It returns CL_INVALID_VALUE 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> |
| </div> |
| <div class="paragraph"> |
| <p>Add the following to <em>table 4.1</em>:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 40%;"> |
| <col style="width: 20%;"> |
| <col style="width: 40%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>cl_platform_info enum</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Return Type</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>CL_PLATFORM_ICD_SUFFIX_KHR</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">char[]</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">The function name suffix used to identify extension functions to be |
| directed to this platform by the ICD Loader.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-source-code">2.12. Source Code</h3> |
| <div class="paragraph"> |
| <p>The official source for the ICD loader is available on github, at:</p> |
| </div> |
| <div class="paragraph"> |
| <p><a href="https://github.com/KhronosGroup/OpenCL-ICD-Loader" class="bare">https://github.com/KhronosGroup/OpenCL-ICD-Loader</a></p> |
| </div> |
| <div class="paragraph"> |
| <p>The complete <code>_cl_icd_dispatch</code> structure is defined in the header |
| <strong>cl_icd.h</strong>, which is available as a part of the OpenCL headers.</p> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_icd-issues">2.13. Issues</h3> |
| <div class="olist arabic"> |
| <ol class="arabic"> |
| <li> |
| <p>Some OpenCL functions do not take an object argument from which their |
| vendor library may be identified (e.g, clUnloadCompiler), how will they |
| be handled?</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>RESOLVED: Such functions will be a noop for all calls through the ICD.</p> |
| </div> |
| </div> |
| </div> |
| </li> |
| <li> |
| <p>How are OpenCL extension to be handled?</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>RESOLVED: OpenCL extension functions may be added to the ICD as soon as they |
| are implemented by any vendor. |
| The suffix mechanism provides access for vendor extensions which are not yet |
| added to the ICD.</p> |
| </div> |
| </div> |
| </div> |
| </li> |
| <li> |
| <p>How will the ICD handle a <code>NULL</code> cl_platform_id?</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>RESOLVED: The ICD will by default choose the first enumerated platform as |
| the <code>NULL</code> platform. |
| The user can override this default by setting an environment variable |
| OPENCL_ICD_DEFAULT_PLATFORM to the desired platform index. |
| The API calls that deal with platforms will return CL_INVALID_PLATFORM if |
| the index is not between zero and (number of platforms - 1), both inclusive.</p> |
| </div> |
| </div> |
| </div> |
| </li> |
| <li> |
| <p>There exists no mechanism to unload the ICD, should there be one?</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>RESOLVED: As there is no standard mechanism for unloading a vendor |
| implementation, do not add one for the ICD.</p> |
| </div> |
| </div> |
| </div> |
| </li> |
| <li> |
| <p>How will the ICD loader handle <code>NULL</code> objects passed to the OpenCL |
| functions?</p> |
| <div class="openblock"> |
| <div class="content"> |
| <div class="paragraph"> |
| <p>RESOLVED: The ICD loader will check for <code>NULL</code> objects passed to the OpenCL |
| functions without trying to dereference the <code>NULL</code> objects for obtaining the |
| ICD dispatch table. |
| On detecting a <code>NULL</code> object it will return one of the CL_INVALID_* error |
| values corresponding to the object in question.</p> |
| </div> |
| </div> |
| </div> |
| </li> |
| </ol> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="cl_khr_byte_addressable_store">3. Byte Addressable Stores</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This section describes the <strong>cl_khr_byte_addressable_store</strong> extension. |
| This extension relaxes restrictions on pointers to <code>char</code>, <code>uchar</code>, <code>char2</code>, <code>uchar2</code>, <code>short</code>, <code>ushort</code> and <code>half</code> that were present in <em>Section 6.8m: Restrictions</em> of the OpenCL 1.0 specification. |
| With this extension, applications are able to read from and write to pointers to these types.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This extension became a core feature in OpenCL 1.1.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_general_information_2">3.1. General information</h3> |
| <div class="sect3"> |
| <h4 id="_version_history_2">3.1.1. Version history</h4> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Date</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Version</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">2020-04-21</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1.0.0</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">First assigned version.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="cl_khr_3d_image_writes">4. Writing to 3D Image Objects</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This section describes the <strong>cl_khr_3d_image_writes</strong> extension.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This extension adds built-in functions that allow a kernel to write to 3D image objects in addition to 2D image objects.</p> |
| </div> |
| <div class="paragraph"> |
| <p>This extension became a core feature in OpenCL 2.0.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_general_information_3">4.1. General information</h3> |
| <div class="sect3"> |
| <h4 id="_version_history_3">4.1.1. Version history</h4> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Date</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Version</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">2020-04-21</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1.0.0</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">First assigned version.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>The new built-in functions are described in the table below:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 1. <em>3D Image Built-in Image Write Functions</em></caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Function</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">void <strong>write_imagef</strong> (<br> |
| image3d_t <em>image</em>,<br> |
| int4 <em>coord</em>,<br> |
| float4 <em>color</em>)<br> |
| <br> |
| void <strong>write_imagei</strong> (<br> |
| image3d_t <em>image</em>,<br> |
| int4 <em>coord</em>,<br> |
| int4 <em>color</em>)<br> |
| <br> |
| void <strong>write_imageui</strong> (<br> |
| image3d_t <em>image</em>,<br> |
| int4 <em>coord</em>,<br> |
| uint4 <em>color</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Write <em>color</em> value to the location specified by coordinate (<em>x</em>, <em>y</em>, <em>z</em>) in the 3D image specified by <em>image</em>. |
| The appropriate data format conversion to the specified image format is done before writing the color value. |
| <em>coord.x</em>, <em>coord.y</em>, and <em>coord.z</em> are considered to be unnormalized coordinates and must be in the range 0 …​ image width - 1, 0 …​ image height - 1, and 0 …​ image depth - 1.<br> |
| <br> |
| <strong>write_imagef</strong> can only be used with image objects created with <em>image_channel_data_type</em> set to one of the pre-defined packed formats or set to CL_SNORM_INT8, CL_UNORM_INT8, CL_SNORM_INT16, CL_UNORM_INT16, CL_HALF_FLOAT, or CL_FLOAT. Appropriate data format conversion will be done to convert the channel data from a floating-point value to the actual data format in which the channels are stored.<br> |
| <br> |
| <strong>write_imagei</strong> can only be used with image objects created with <em>image_channel_data_type</em> set to one of the following values:<br> |
| CL_SIGNED_INT8,<br> |
| CL_SIGNED_INT16, or<br> |
| CL_SIGNED_INT32.<br> |
| <br> |
| <strong>write_imageui</strong> can only be used with image objects created with <em>image_channel_data_type</em> set to one of the following values:<br> |
| CL_UNSIGNED_INT8,<br> |
| CL_UNSIGNED_INT16, or<br> |
| CL_UNSIGNED_INT32.<br> |
| <br> |
| The behavior of <strong>write_imagef</strong>, <strong>write_imagei</strong>, and <strong>write_imageui</strong> for image objects created with <em>image_channel_data_type</em> values not specified in the description above, or with (<em>x</em>, <em>y</em>, <em>z</em>) coordinate values that are not in the range (0 …​ image width - 1, 0 …​ image height - 1, 0 …​ image depth - 1) respectively, is undefined.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div class="sect1"> |
| <h2 id="cl_khr_fp16">5. Half Precision Floating-Point</h2> |
| <div class="sectionbody"> |
| <div class="paragraph"> |
| <p>This section describes the <strong>cl_khr_fp16</strong> extension. |
| This extension adds support for half scalar and vector types as built-in |
| types that can be used for arithmetic operations, conversions etc.</p> |
| </div> |
| <div class="sect2"> |
| <h3 id="_general_information_4">5.1. General information</h3> |
| <div class="sect3"> |
| <h4 id="_version_history_4">5.1.1. Version history</h4> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 20%;"> |
| <col style="width: 20%;"> |
| <col style="width: 60%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Date</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Version</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">2020-04-21</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">1.0.0</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">First assigned version.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| </div> |
| <div class="sect2"> |
| <h3 id="cl_khr_fp16-additions-to-chapter-6-of-the-opencl-2.0-specification">5.2. Additions to Chapter 6 of the OpenCL 2.0 C Specification</h3> |
| <div class="paragraph"> |
| <p>The list of built-in scalar, and vector data types defined in <em>tables 6.1</em>, |
| and <em>6.2</em> are extended to include the following:</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <colgroup> |
| <col style="width: 25%;"> |
| <col style="width: 75%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Type</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half2</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 2-component half-precision floating-point vector.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half3</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 3-component half-precision floating-point vector.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half4</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 4-component half-precision floating-point vector.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half8</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 8-component half-precision floating-point vector.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half16</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">A 16-component half-precision floating-point vector.</p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>The built-in vector data types for <code>halfn</code> are also declared as appropriate |
| types in the OpenCL API (and header files) that can be used by an |
| application. |
| The following table describes the built-in vector data types for <code>halfn</code> as |
| defined in the OpenCL C programming language and the corresponding data type |
| available to the application:</p> |
| </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"><strong>Type in OpenCL Language</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>API type for application</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half2</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>cl_half2</strong></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half3</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>cl_half3</strong></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half4</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>cl_half4</strong></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half8</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>cl_half8</strong></p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>half16</strong></p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>cl_half16</strong></p></td> |
| </tr> |
| </tbody> |
| </table> |
| <div class="paragraph"> |
| <p>The relational, equality, logical and logical unary operators described in |
| <em>section 6.3</em> can be used with <code>half</code> scalar and <code>halfn</code> vector types and |
| shall produce a scalar <code>int</code> and vector <code>shortn</code> result respectively.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The OpenCL compiler accepts an h and H suffix on floating point literals, |
| indicating the literal is typed as a half.</p> |
| </div> |
| <div class="sect3"> |
| <h4 id="cl_khr_fp16-conversions">5.2.1. Conversions</h4> |
| <div class="paragraph"> |
| <p>The implicit conversion rules specified in <em>section 6.2.1</em> now include the |
| <code>half</code> scalar and <code>halfn</code> vector data types.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The explicit casts described in <em>section 6.2.2</em> are extended to take a |
| <code>half</code> scalar data type and a <code>halfn</code> vector data type.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The explicit conversion functions described in <em>section 6.2.3</em> are extended |
| to take a <code>half</code> scalar data type and a <code>halfn</code> vector data type.</p> |
| </div> |
| <div class="paragraph"> |
| <p>The <code>as_typen()</code> function for re-interpreting types as described in <em>section |
| 6.2.4.2</em> is extended to allow conversion-free casts between <code>shortn</code>, |
| <code>ushortn</code>, and <code>halfn</code> scalar and vector data types.</p> |
| </div> |
| </div> |
| <div class="sect3"> |
| <h4 id="cl_khr_fp16-math-functions">5.2.2. Math Functions</h4> |
| <div class="paragraph"> |
| <p>The built-in math functions defined in <em>table 6.8</em> (also listed below) are |
| extended to include appropriate versions of functions that take <code>half</code> and |
| <code>half{2|3|4|8|16}</code> as arguments and return values. |
| <code>gentype</code> now also includes <code>half</code>, <code>half2</code>, <code>half3</code>, <code>half4</code>, <code>half8</code>, and |
| <code>half16</code>.</p> |
| </div> |
| <div class="paragraph"> |
| <p>For any specific use of a function, the actual type has to be the same for |
| all arguments and the return type.</p> |
| </div> |
| <table class="tableblock frame-all grid-all stretch"> |
| <caption class="title">Table 2. <em>Half Precision Built-in Math Functions</em></caption> |
| <colgroup> |
| <col style="width: 50%;"> |
| <col style="width: 50%;"> |
| </colgroup> |
| <thead> |
| <tr> |
| <th class="tableblock halign-left valign-top"><strong>Function</strong></th> |
| <th class="tableblock halign-left valign-top"><strong>Description</strong></th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>acos</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Arc cosine function.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>acosh</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Inverse hyperbolic cosine.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>acospi</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <strong>acos</strong> (<em>x</em>) / π.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>asin</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Arc sine function.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>asinh</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Inverse hyperbolic sine.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>asinpi</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <strong>asin</strong> (<em>x</em>) / π.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>atan</strong> (gentype <em>y_over_x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Arc tangent function.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>atan2</strong> (gentype <em>y</em>, gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Arc tangent of <em>y</em> / <em>x</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>atanh</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Hyperbolic arc tangent.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>atanpi</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <strong>atan</strong> (<em>x</em>) / π.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>atan2pi</strong> (gentype <em>y</em>, gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <strong>atan2</strong> (<em>y</em>, <em>x</em>) / π.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>cbrt</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute cube-root.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>ceil</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Round to integral value using the round to positive infinity rounding |
| mode.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>copysign</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns <em>x</em> with its sign changed to match the sign of <em>y</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>cos</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute cosine.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>cosh</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute hyperbolic cosine.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>cospi</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <strong>cos</strong> (Ï€ <em>x</em>).</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>erfc</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Complementary error function.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>erf</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Error function encountered in integrating the normal distribution.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>exp</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute the base- e exponential of <em>x</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>exp2</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Exponential base 2 function.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>exp10</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Exponential base 10 function.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>expm1</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <em>e<sup>x</sup></em>- 1.0.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>fabs</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute absolute value of a floating-point number.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>fdim</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><em>x</em> - <em>y</em> if <em>x</em> > <em>y</em>, +0 if x is less than or equal to y.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>floor</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Round to integral value using the round to negative infinity rounding |
| mode.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>fma</strong> (gentype <em>a</em>, gentype <em>b</em>, gentype <em>c</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns the correctly rounded floating-point representation of the sum of |
| <em>c</em> with the infinitely precise product of <em>a</em> and <em>b</em>. |
| Rounding of intermediate products shall not occur. |
| Edge case behavior is per the IEEE 754-2008 standard.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>fmax</strong> (gentype <em>x</em>, gentype <em>y</em>)<br> |
| gentype <strong>fmax</strong> (gentype <em>x</em>, half <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns <em>y</em> if <em>x</em> < <em>y</em>, otherwise it returns <em>x</em>. |
| If one argument is a NaN, <strong>fmax()</strong> returns the other argument. |
| If both arguments are NaNs, <strong>fmax()</strong> returns a NaN.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>fmin</strong> (gentype <em>x</em>, gentype <em>y</em>)<br> |
| gentype <strong>fmin</strong> (gentype <em>x</em>, half <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns <em>y</em> if <em>y</em> < <em>x</em>, otherwise it returns <em>x</em>. |
| If one argument is a NaN, <strong>fmin()</strong> returns the other argument. |
| If both arguments are NaNs, <strong>fmin()</strong> returns a NaN.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>fmod</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Modulus. |
| Returns <em>x</em> - <em>y</em> * <strong>trunc</strong> (<em>x</em>/<em>y</em>) .</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>fract</strong> (gentype <em>x</em>, __global gentype *<em>iptr</em>)<br> |
| gentype <strong>fract</strong> (gentype <em>x</em>, __local gentype *<em>iptr</em>)<br> |
| gentype <strong>fract</strong> (gentype <em>x</em>, __private gentype *<em>iptr</em>)<br></p> |
| <p class="tableblock"> For OpenCL C 2.0 or with the <code>__opencl_c_generic_address_space</code> |
| feature macro:<br></p> |
| <p class="tableblock"> gentype <strong>fract</strong> (gentype <em>x</em>, gentype *<em>iptr</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns <strong>fmin</strong>( <em>x</em> - <strong>floor</strong> (<em>x</em>), 0x1.ffcp-1f ).</p> |
| <p class="tableblock"> <strong>floor</strong>(x) is returned in <em>iptr</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">half<em>n</em> <strong>frexp</strong> (half<em>n x</em>, __global int<em>n</em> *exp)<br> |
| half <strong>frexp</strong> (half <em>x</em>, __global int *exp)<br></p> |
| <p class="tableblock"> half<em>n</em> <strong>frexp</strong> (half<em>n x</em>, __local int<em>n</em> *exp)<br> |
| half <strong>frexp</strong> (half <em>x</em>, __local int *exp)<br></p> |
| <p class="tableblock"> half<em>n</em> <strong>frexp</strong> (half<em>n x</em>, __private int<em>n</em> *exp)<br> |
| half <strong>frexp</strong> (half <em>x</em>, __private int *exp)<br></p> |
| <p class="tableblock"> For OpenCL C 2.0 or with the <code>__opencl_c_generic_address_space</code> |
| feature macro:<br></p> |
| <p class="tableblock"> half<em>n</em> <strong>frexp</strong> (half<em>n</em> <em>x</em>, int<em>n</em> *exp)<br> |
| half <strong>frexp</strong> (half <em>x</em>, int *exp)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Extract mantissa and exponent from <em>x</em>. |
| For each component the mantissa returned is a float with magnitude in the |
| interval [1/2, 1) or 0. |
| Each component of <em>x</em> equals mantissa returned * 2<em><sup>exp</sup></em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>hypot</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute the value of the square root of <em>x</em><sup>2</sup>+ <em>y</em><sup>2</sup> without undue |
| overflow or underflow.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">int<em>n</em> <strong>ilogb</strong> (half<em>n</em> <em>x</em>)<br> |
| int <strong>ilogb</strong> (half <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Return the exponent as an integer value.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">half<em>n</em> <strong>ldexp</strong> (half<em>n</em> <em>x</em>, int<em>n</em> <em>k</em>)<br> |
| half<em>n</em> <strong>ldexp</strong> (half<em>n</em> <em>x</em>, int <em>k</em>)<br> |
| half <strong>ldexp</strong> (half <em>x</em>, int <em>k</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Multiply <em>x</em> by 2 to the power <em>k</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>lgamma</strong> (gentype <em>x</em>)<br></p> |
| <p class="tableblock"> half<em>n</em> <strong>lgamma_r</strong> (half<em>n</em> <em>x</em>, __global int<em>n</em> *<em>signp</em>)<br> |
| half <strong>lgamma_r</strong> (half <em>x</em>, __global int *<em>signp</em>)<br></p> |
| <p class="tableblock"> half<em>n</em> <strong>lgamma_r</strong> (half<em>n</em> <em>x</em>, __local int<em>n</em> *<em>signp</em>)<br> |
| half <strong>lgamma_r</strong> (half <em>x</em>, __local int *<em>signp</em>)<br></p> |
| <p class="tableblock"> half<em>n</em> <strong>lgamma_r</strong> (half<em>n</em> <em>x</em>, __private int<em>n</em> *<em>signp</em>)<br> |
| half <strong>lgamma_r</strong> (half <em>x</em>, __private int *<em>signp</em>)<br></p> |
| <p class="tableblock"> For OpenCL C 2.0 or with the <code>__opencl_c_generic_address_space</code> |
| feature macro:<br></p> |
| <p class="tableblock"> half<em>n</em> <strong>lgamma_r</strong> (half<em>n</em> <em>x</em>, int<em>n</em> *<em>signp</em>)<br> |
| half <strong>lgamma_r</strong> (half <em>x</em>, int *<em>signp</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Log gamma function. |
| Returns the natural logarithm of the absolute value of the gamma function. |
| The sign of the gamma function is returned in the <em>signp</em> argument of |
| <strong>lgamma_r</strong>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>log</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute natural logarithm.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>log2</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute a base 2 logarithm.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>log10</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute a base 10 logarithm.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>log1p</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute log<sub>e</sub>(1.0 + <em>x</em>) .</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>logb</strong> (gentype <em>x</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute the exponent of <em>x</em>, which is the integral part of |
| log<em><sub>r</sub></em>|<em>x</em>|.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>mad</strong> (gentype <em>a</em>, gentype <em>b</em>, gentype <em>c</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock"><strong>mad</strong> computes <em>a</em> * <em>b</em> + <em>c</em>. |
| The function may compute <em>a</em> * <em>b</em> + <em>c</em> with reduced accuracy |
| in the embedded profile. See the SPIR-V OpenCL environment specification |
| for details. On some hardware the mad instruction may provide better |
| performance than expanded computation of <em>a</em> * <em>b</em> + <em>c</em>.</p> |
| <p class="tableblock"> Note: For some usages, e.g. <strong>mad</strong>(a, b, -a*b), the half precision |
| definition of <strong>mad</strong>() is loose enough that almost any result is allowed |
| from <strong>mad</strong>() for some values of a and b.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>maxmag</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns <em>x</em> if |<em>x</em>| > |<em>y</em>|, <em>y</em> if |<em>y</em>| > |<em>x</em>|, otherwise |
| <strong>fmax</strong>(<em>x</em>, <em>y</em>).</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>minmag</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns <em>x</em> if |<em>x</em>| < |<em>y</em>|, <em>y</em> if |<em>y</em>| < |<em>x</em>|, otherwise |
| <strong>fmin</strong>(<em>x</em>, <em>y</em>).</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>modf</strong> (gentype <em>x</em>, __global gentype *<em>iptr</em>)<br> |
| gentype <strong>modf</strong> (gentype <em>x</em>, __local gentype *<em>iptr</em>)<br> |
| gentype <strong>modf</strong> (gentype <em>x</em>, __private gentype *<em>iptr</em>)<br></p> |
| <p class="tableblock"> For OpenCL C 2.0 or with the <code>__opencl_c_generic_address_space</code> |
| feature macro:<br></p> |
| <p class="tableblock"> gentype <strong>modf</strong> (gentype <em>x</em>, gentype *<em>iptr</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Decompose a floating-point number. |
| The <strong>modf</strong> function breaks the argument <em>x</em> into integral and fractional |
| parts, each of which has the same sign as the argument. |
| It stores the integral part in the object pointed to by <em>iptr</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">half<em>n</em> <strong>nan</strong> (ushort<em>n</em> <em>nancode</em>)<br> |
| half <strong>nan</strong> (ushort <em>nancode</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Returns a quiet NaN. |
| The <em>nancode</em> may be placed in the significand of the resulting NaN.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>nextafter</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Computes the next representable half-precision floating-point value |
| following <em>x</em> in the direction of <em>y</em>. |
| Thus, if <em>y</em> is less than <em>x</em>, <strong>nextafter</strong>() returns the largest |
| representable floating-point number less than <em>x</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">gentype <strong>pow</strong> (gentype <em>x</em>, gentype <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <em>x</em> to the power <em>y</em>.</p></td> |
| </tr> |
| <tr> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">half<em>n</em> <strong>pown</strong> (half<em>n</em> <em>x</em>, int<em>n</em> <em>y</em>)<br> |
| half <strong>pown</strong> (half <em>x</em>, int <em>y</em>)</p></td> |
| <td class="tableblock halign-left valign-top"><p class="tableblock">Compute <em>x</em> to the power |