CINXE.COM
NVIDIA Nsight Visual Studio Edition | NVIDIA Developer
<!DOCTYPE html> <html lang='en' class='h-100'> <head> <meta name="viewport" content="width=device-width,initial-scale=1"> <meta name="csrf-param" content="authenticity_token" /> <meta name="csrf-token" content="InxJ8k-2q31tu0MZ4qmIVDXQIF5oZQLrGT_aFRlY0rP2tSdD0xSnqndnho1JMJUfLU2egQ0Z3BYC3plmtmxHRg" /> <meta name="csp-nonce" /> <title>NVIDIA Nsight Visual Studio Edition | NVIDIA Developer</title> <link rel="canonical" href="https://developer.nvidia.com/nsight-visual-studio-edition"> <link rel="alternate" href="https://developer.nvidia.com/nsight-visual-studio-edition" hreflang="x-default"> <link rel="alternate" href="https://developer.nvidia.com/nsight-visual-studio-edition" hreflang="en-us"> <meta property="og:site_name" content="NVIDIA Developer"> <meta property="og:title" content="NVIDIA Nsight Visual Studio Edition"> <meta property="og:type" content="website"> <meta property="og:image" content="https://developer.download.nvidia.com/images/og-default.jpg"> <meta property="og:url" content="https://developer.nvidia.com/nsight-visual-studio-edition"> <meta name="twitter:title" content="NVIDIA Nsight Visual Studio Edition"> <meta name="twitter:image" content="https://developer.download.nvidia.com/images/og-default.jpg"> <meta name="twitter:site" content="@NVIDIA"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:creator" content="@NVIDIA"> <meta property="industry" content="HPC / Scientific Computing"> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/application-850056c0e23225daee0fd1b592d57245911c990e3aefce82212f37ebf18d96de.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/one-trust-bea625cf16a072ce5fdb0707a19f2645daf63c05eb1a016db72773eba008fc07.css" /> <script src="https://cdn.cookielaw.org/scripttemplates/otSDKStub.js" data-document-language="true" type="text/javascript" charset="UTF-8" data-domain-script="3e2b62ff-7ae7-4ac5-87c8-d5949ecafff5"></script> <script type="text/javascript" src="https://images.nvidia.com/aem-dam/Solutions/ot-js/ot-custom.js"></script> <script> function OptanonWrapper() { let event = new Event('bannerLoaded'); window.dispatchEvent(event); if (window.OnetrustActiveGroups && window.OnetrustActiveGroups.includes("C0002")) { window.DD_RUM && window.DD_RUM.init({ clientToken: 'pub0430c74fae5d2b467bcb8d48b13e5b32', applicationId: '9fc963c7-14e6-403d-bdec-ee671550bb7f', site: 'datadoghq.com', service: 'devzone', env: 'production', version: '', sessionSampleRate: 10, sessionReplaySampleRate: 5, trackUserInteractions: true, trackResources: true, trackLongTasks: true, defaultPrivacyLevel: 'mask-user-input', }); } } </script> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/vars-cd3a0769a3c2f2d9ea6b83ac53ce86bceef4c719e4dbd22ed41d48d01f200901.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/fonts-910bdb814ac830981904d69eea803431bc3a5b00aac30ffc85d12983c6511741.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/ballistiq-twitterfeed-61a757e5494e5598582c3610822f4cc0d00c0f1c3d70d478b0004dcebebf2368.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/application-a780279f5932e2d3fe01da14ba98d5c320956ec365747dfca2719798ce778ae6.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/embedded/embedded-bde5659f6ab1dd4f9edcf851e8c12fb3c44ed2de1542a3bd9131d207afdb0d7d.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/overrides-cbc02aeca05448d7c77b2b63dc1faa3f5e58c17afd5afe4a5122591949c5d734.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/new-styles-37d9681cbab3b14d1c92fc036ceb563d8fc93f75cebcbc61a56cbeddc83154d7.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/feed-aggregator/feed-aggregator-9ace7521871242143cb35fa86d5be702c4dacb409600041fa6a5b14fa2a71dde.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/bootstrap-glyphicons-fe132ea5867b21620f37b392a53d872fb240e34ad8b477db370b6f867ccd102f.css" media="all" /> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/d3.v4.min-41cfecdf7c41476e805de7afacf4aacdd1a4be6947fbecf95217e947ebc2faf5.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/visualize-d-06443fdef48364af6635f0d1d3535da26910671f6f6a680c531eff0e54ed595f.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/js.cookie.min-bd09df6e81cb21935c4e92d9631a162285611f17c6eaee720cafcc6ddef3f7dc.js"></script> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/sf-validation/sf-validation-805362e079494cd052f713be5f91a44eb602f545c342f794abbd4a8050c0acb3.css" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/tablefilter/tablefilter-ad35ad42b6d4f1068765cf691a0dcb4214ba7925ea4e28b9a1ce48a0ddb3d489.css" media="all" /> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/tablefilter/filtered-table-891467932064f1f3e379852c0697e014d6c0f99a6d423b4468e55ae59d159adf.css" media="all" /> <script src="https://assets.adobedtm.com/5d4962a43b79/c1061d2c5e7b/launch-191c2462b890.min.js" data-ot-ignore="true"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.3/jquery.min.js" integrity="sha512-STof4xm1wgkfm7heWqFJVn58Hm3EtS31XFaagaa8VMReCXAkQnJZ+jEy8PCC/iT18dFy95WcExNHFTqLyp72eQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script src="https://api-prod.nvidia.com/search/nvidia-gallery-widget.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/devzone3/modules/nvidia_editor/nod_widgets-8c38a7d04ed3c3acd9117aa126bf76d7902d3c57c72b76dbf3c281c96ed09975.js"></script> <link rel="icon" type="image/x-icon" href="https://dirms4qsy6412.cloudfront.net/assets/favicon-81bff16cada05fcff11e5711f7e6212bdc2e0a32ee57cd640a8cf66c87a6cbe6.ico" /> </head> <body class='d-flex flex-column h-100' data-theme='devzone3_old'> <div id='header'></div> <div id="wrapper" class="page-nsight-visual-studio-edition" data-id="287"> <div id="content-background" class=""> <div class="separator"></div> <div id="content" class="container"> <div class="row"> <section class="dz3-main-section dz-old-theme node field-name-body"> <a id="main-content"></a> <div class='page-header'><h1 class='title'>NVIDIA Nsight Visual Studio Edition</h1></div> <style> .PopBoxImageSmall { border: solid 1px #999999; cursor: url("https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/misc/popbox/magplus.cur"), pointer; } .PopBoxImageLarge { border: solid 1px #999999; cursor: url("https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/misc/popbox/magplus.cur"), pointer; } .PopBoxImageShrink { cursor: url("https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/misc/popbox/magminus.cur"), pointer; } .PopBoxImageLink { cursor: pointer; } .PopBoxImageMove { border: none 0px #ffffff; cursor: pointer; } </style> <script> jQuery(function($) { loadScripts(['https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/misc/popbox/popbox_autoload.js__3.txt']); // http://stackoverflow.com/a/11123701/405017 function loadScripts(uris,whenDone){ if (!uris.length) whenDone && whenDone(); else{ for (var wait=[],i=uris.length;i--;){ var tag = document.createElement('script'); tag.type = 'text/javascript'; tag.src = uris[i]; if (whenDone){ wait.push(tag) tag.onload = maybeDone; tag.onreadystatechange = maybeDone; // For IE8- } document.body.appendChild(tag); } } function maybeDone(){ if (this.readyState===undefined || this.readyState==='complete'){ for (var i=wait.length;i--;) if (wait[i]==this) wait.splice(i,1); if (!wait.length) whenDone(); } } } } ); </script> <p> <style type="text/css"> #nsight-feature-box { border-collapse: collapse; border: 0; margin: 1em auto; } #nsight-feature-box td { vertical-align: top; width: 50%; padding-bottom: 2em; text-align: center; } #nsight-feature-box td img { margin: 0 auto; } #nsight-feature-box td ul { text-align: left; } #main .download-list { color: rgb(102,102,102); } #main .download-list a { font-weight: bold; display: block; } #main .download-list li { margin-bottom: 0.6em; } #main .download-list p { margin: 0; margin-bottom: 0.6em; } .QuickLinksSub { font-weight: normal; font-size: 8pt; color: #666; } .QuoteBox { text-align: center; margin: 1em auto; } .DownloadBox { font-size: 14pt; font-weight: bold; background-color: #ddd; text-align: center; border: 1px solid #bbb; width: 450px; margin: 1em auto; border-radius: 5px; } .AnnounceBox { background-color: #ddd; text-align: center; border: 1px solid #bbb; margin: 2em auto; border-radius: 5px; margin-right: 260px; } </style> </p> <p> <i>For compute developers working in Eclipse development environment, please see <a href="/nsight-eclipse-edition">Nsight Eclipse Edition</a></i> </p> <p class="lead"> NVIDIA® Nsight™ Visual Studio Edition is an application development environment for heterogeneous platforms which brings GPU computing into Microsoft Visual Studio. NVIDIA® Nsight™ VSE allows you to build and debug integrated GPU kernels and native CPU code as well as inspect the state of the GPU and memory.</p> <p></p> <center> <!-- No Need for 3 buttons to the same download page. Keep this in case we go to the DLC (per release) --> <a class="btn btn-success" href="/nsight-visual-studio-edition-2025_1"><i class="fa fa-download"></i> Download 2025.1</a> </center> <h5 align="center"> <a href="nsight-visual-studio-edition-2025_1-new-features">Version 2025.1 New Features</a> | <a href="https://developer.nvidia.com/nsight-visual-studio-edition-archive">Revision History</a> </h5> <p></p><center><small><strong>NVIDIA® Nsight™ Visual Studio Edition</strong> is freely offered through the <a href="/sign-up-gameworks-registered-developer-program">NVIDIA Registered Developer Program</a> and as part of the <a href="https://developer.nvidia.com/cuda-toolkit">CUDA Toolkit</a></small></center> <br> <p align="center"> <!--- <a href="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2019_1/2019.1_Nsight_Visual_Studio_Edition_Landing_Banner.png"> <img alt="" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2019_1/2019.1_Nsight_Visual_Studio_Edition_Landing_Banner.png" style="border:1px solid lightgray"><br /> </a> --> <a href="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2019_3/NsightVSE_2019_3_OptixAppDebugging.PNG"> <img alt="" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2019_3/NsightVSE_2019_3_OptixAppDebugging.PNG" style="border:1px solid lightgray"><br> </a> </p><h4 align="center"> Debugging in Optix Applications in Nsight Visual Studio Edition <br> </h4> <!-- <h3>Key Features</h3> <ul> <li> Debug your CUDA C/C++ and DirectCompute source code directly on the latest GPU hardware</li> <li> Debug native Visual Studio CPU and CUDA GPU code within the same debugging session</li> <li> Use the familiar Visual Studio Locals, Watches, Memory and Breakpoints windows</li> <li> Inspect the CUDA kernel state using customs views for GPU registers, warps, lanes, and threads for navigating massively parallel threads states and contexts</li> </ul> --> <h3>Gallery</h3> <div class="row"> <div class="col-sm-6"> <p class="text-center"> <img alt="" class="PopBoxImageSmall" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse60/60_Next-Gen_Debugger_PTX%2BSASS.png" style="width: 590px; height: 345px;" title="Click to zoom/shrink"> </p> <p class="text-center"> <strong>Nsight Visual Studio Edition CUDA Debugger Key Features</strong> </p> <p class="text-center"> </p> <ul> <li> Debug your CUDA C/C++ <!--and DirectCompute --> source code directly on the latest GPU hardware</li> <li> Debug native Visual Studio CPU and CUDA GPU code within the same debugging session</li> <li> Use the familiar Visual Studio Locals, Watches, Memory and Breakpoints windows</li> <li> Inspect the CUDA kernel state using customs views for GPU registers, warps, lanes, and threads for navigating massively parallel threads states and contexts</li> </ul> </div> <div class="col-sm-6"> <p class="text-center"> <img alt="" class="PopBoxImageSmall" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2020_1/NsVSE_Dbg_Watch_Vw.png" style="width: 590px; height: 345px;" title="Click to zoom/shrink"> </p> <p class="text-center"> <strong>Nsight Visual Studio Edition CUDA Debugger Watch Window</strong> </p> <p class="text-center"> </p> <ul> <li> View Source variables, PTX & SASS registers in Locals & Watch Views</li> <li> Expressions supported in Watch view</li> <li> Updated variables are displayed with red font</li> <li> Struct/Vector/Array contents display on a single line</li> <li> Array max length settings</li> <li> Error messages for out-of-scope or invalid expressions</li> </ul> </div> </div> <div class="row"> <div class="col-sm-6"> <p class="text-center"> <img alt="" class="PopBoxImageSmall" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2020_1/NsVSE_Dbg_SrcPtxSass_Vw.png" style="width: 590px; height: 345px;" title="Click to zoom/shrink"> </p> <p class="text-center"> <strong>Nsight Visual Studio Edition CUDA Debugger Source Code View</strong> </p> <p class="text-center"> </p> <ul> <li> View correlated Source, PTX, and SASS</li> <li> Set breakpoints in Source and/or SASS</li> <li> Step over, in, out, continue in source or PTX/SASS disassembly</li> <li> Conditional breakpoints operate on source vars and PTX/SASS regs</li> <li> Hover over variables and registers to view values</li> </ul> </div> <div class="col-sm-6"> <p class="text-center"> <img alt="" class="PopBoxImageSmall" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2020_1/NsVSE_Dbg_BrkPt_Vw.png" style="width: 590px; height: 345px;" title="Click to zoom/shrink"> </p> <p class="text-center"> <strong>Nsight Visual Studio Edition CUDA Debugger Breakpoints View</strong> </p> <p class="text-center"> </p> <ul> <li> Supported Breakpoints for Native(CPU) and CUDA C/C++ code, including<br> Source, SASS, Function, Conditional, Data</li> <li> Full GPU and CPU State provided while at breakpoint</li> <li> Process and Thread selection available</li> <li> Conditional breakpoints operate on source vars and PTX/SASS regs</li> </ul> </div> </div> <div class="row"> <div class="col-sm-6"> <p class="text-center"> <img alt="" class="PopBoxImageSmall" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2020_1/NsVSE_Dbg_WarpInfo_Vw.png" style="width: 590px; height: 345px;" title="Click to zoom/shrink"> </p> <p class="text-center"> <strong>Nsight Visual Studio Edition CUDA Debugger Warp Info View</strong> </p> <p class="text-center"> </p> <ul> <li> Warp Info shows the active warps on the GPU, one warp per row</li> <li> Arrow indicates the in-focus thread, providing state for the rest of the views</li> <li> Focus warp (row) or thread can be changed with a mouse click to provide further state inspection (unless warp is unlaunched/done)</li> <li> Various ‘Freeze Modes’ to for run control of other warps</li> <!-- <li> Warps can be frozen or unfrozen to by right-mouse clicking</li> --> <li> Warps are color coded to indicate their state</li> <li>Filtering can be done to minimize warp results</li> <li>Columns Not shown (PC, ActiveMask, HitMask, Status)</li> </ul> </div> <div class="col-sm-6"> <p class="text-center"> <img alt="" class="PopBoxImageSmall" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2020_1/NsVSE_Dbg_GpuRegisters_Vw.png" style="width: 590px; height: 345px;" title="Click to zoom/shrink"> </p> <p class="text-center"> <strong>Nsight Visual Studio Edition CUDA Debugger GPU Registers View</strong> </p> <p class="text-center"> </p> <ul> <li> Inspect PTX, SASS, Predicate, Conditional, and Uniform registers at this configurable GPU Register view</li> <li> Visual Studio register view can also be configured to show GPU registers</li> <li> This view can be configured to hide/show registers sets</li> <li> Always hides registers that are not supported by the architecture (Not a Turing GPU, so no Uniform registers shown)</li> <li> Can select and copy-to-clipboard</li> <li> Red text indicates updated values</li> </ul> </div> </div> <h3>More NVIDIA DevTools Visual Studio Integration</h3> <div class="row"> <div class="col-sm-6 "> <p class="text-center"> <img alt="" class="PopBoxImageSmall" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/tools/nsvse/nsvse2020_2/Ballista%2BNsightVSE2020_2-Menu.png"> </p> <p class="text-center"> <strong>NVIDIA Nsight Integration (highlighted) under the Nsight menu</strong> </p> <p class="text-center"> <!-- More Info --> </p> </div> <div class="col-sm-6 "> <br> <h4>NVIDIA Nsight Developer Tools Integration for Visual Studio</h4> <p>In Nsight VSE 2020.1.1, the integrated Graphics Frame Debuggers and integrated Profilers have been removed, but don't worry, you haven't lost this functionality.<br><b>NVIDIA Nsight Integration</b> is a Visual Studio extension that allows you to access the power of the following NVIDIA Nsight standalone tools from within Visual Studio. </p> <ul> <li> <a href="https://developer.nvidia.com/nsight-compute"> Nsight Compute</a> : CUDA application interactive kernel profiler</li> <li> <a href="https://developer.nvidia.com/nsight-graphics">Nsight Graphics</a> : Graphics application frame debugger and profiler</li> <li> <a href="https://developer.nvidia.com/nsight-systems"> Nsight Systems</a> : System-wide performance analysis tool</li> </ul> <p>When any of these tools are installed along with <b><a href="/nsight-tools-visual-studio-integration">NVIDIA Nsight Integration</a></b>, these tools will appear under the NVIDIA '<b>Nsight</b>' menu in the Visual Studio menu bar.</p> </div> </div> <h3>More Nsight Visual Studio Edition Information</h3> <ul class="download-list"> <li> <h4><a href="/nsight-visual-studio-edition-downloads">Downloads</a></h4> <p> Download the latest version and corresponding dependencies</p> </li> <li> <h4> <a href="https://developer.nvidia.com/">NVIDIA Developer Resources</a><i><a href="/sign-up-gameworks-registered-developer-program"> (Sign up required)</a></i> </h4> <p> Access the latest announcements, early release candidate access, file bugs, event invites and more. <a href="/sign-up-gameworks-registered-developer-program">Sign up today!</a></p> </li> <li> <h4><a href="/nsight-visual-studio-edition-features">Product Features</a></h4> <p> List of features of Nsight Visual Studio Edition</p> </li> <li> <h4><a href="/nsight-visual-studio-edition-requirements">Product Requirements</a></h4> <p> Details the hardware and software support of Nsight Visual Studio Edition </p> </li> <li> <h4><a href="/nsight-visual-studio-edition-documentation-and-support">Support and Documentation</a></h4> <p> User Guide, Documentation, Forums, and more</p> </li> <li> <h4><a href="/nsight-visual-studio-edition-videos">Videos</a></h4> <p> Teaser and Instructional Videos showing Nsight Visual Studio Edition in action</p> </li> <li> <h4><a href="/developer-webinars">Webinars</a></h4> <p> Past Nsight Visual Studio Edition Webinars</p> </li> </ul> </section> <aside id="right" class="" role="complementary"> </aside> <!-- /#sidebar-second --> </div> </div> <div class="separator"></div> </div> <div class="white-background"> <div class="separator"></div> <div class="container"> <div class="row"> <div id="pre_footer_left" class="col-xs-12 col-sm-12 col-lg-6"> </div> <div id="pre_footer_right" class="col-xs-12 col-sm-12 col-lg-6"> </div> </div> <div class="separator"></div> </div> </div> </div> <div id='footer' class='mt-auto'></div> <script src="https://dirms4qsy6412.cloudfront.net/assets/feed-aggregator/feed-aggregator-7f147443abc2d1300a239c29e4ba3ca0d0d2eb0dc66b608765e2b3be50e18e10.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/devzone3/old/dist/dz3-old-bundle-f911ee7c2f8b7dd419510ab33721b4c4fbd7b17dfbdac32b2586ccd2c3480c2e.js"></script> <script> const template = document.createElement('template'); template.innerHTML = ` <style> @import "https://dirms4qsy6412.cloudfront.net/assets/feed-aggregator/feed-aggregator-9ace7521871242143cb35fa86d5be702c4dacb409600041fa6a5b14fa2a71dde.css"; .feed-aggregator-component .card { box-shadow: 0 4px 5px 0 rgba(0,0,0,0.14), 0 1px 10px 0 rgba(0,0,0,0.12), 0 2px 4px -1px rgba(0,0,0,0.3) !important; } .feed-aggregator-component .card:hover { box-shadow: 0 0 8px 0 rgba(0,0,0,0.13), 0 14px 32px 5px rgba(0,0,0,0.13) !important; } </style> <div class="feed-aggregator-component"></div> `; const hosts = { 'en': 'https://developer.nvidia.com/blog', 'cn': 'https://developer.nvidia.com/zh-cn/blog', } class FeedAggregatorElement extends HTMLElement { constructor() { super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(template.content.cloneNode(true)); } connectedCallback() { const categories = this.getAttribute('categories'); const tags = this.getAttribute('tags'); const perPage = this.getAttribute('per-page'); const excludedTags = this.getAttribute('excluded-tags'); let locale = this.getAttribute('locale'); if (!locale) { locale = 'en'; } let targetElement = this._shadowRoot.querySelector(".feed-aggregator-component"); let feed = { id: 'blog', host: hosts[locale], type: 'json', minCount: 2, }; if (categories && categories !== 'all') { feed['category_ids'] = categories.split(','); } if (tags && tags !== 'all') { feed['tag_ids'] = tags.split(','); } if(excludedTags && excludedTags !== 'null'){ feed['excluded_tag_ids'] = excludedTags.split(','); } document.addEventListener("DOMContentLoaded", function () { new FeedAggregator({ target: targetElement, props: { count: perPage, openInNewTab: true, showExcerpts: true, feeds: [feed] } }); }) } } window.customElements.define('feed-aggregator', FeedAggregatorElement); </script> <template id='application-button-template'> <style> @import "https://dirms4qsy6412.cloudfront.net/assets/application-button/application-button-68ca7e1e3aa49ec79169d49226e34ee0c341d27a15a38b28ce975cb2467e123e.css"; </style> <a href='' class='nvidia-application-button'>Join now</a> </template> <script> async function fetchMembershipState () { const userInfo = await fetch('/api/user'); const {status} = userInfo; if (status === 401) { let error = new Error('Unauthorized'); error.statusCode = status; throw error; } // TODO: Figure out how to get DZ4 program // Fetch page info. const {pathname} = location; const pageInfo = await fetch(`${pathname}.json`); const pageData = await pageInfo.json(); // Fetch membership info return pageData; } const initApplicationButton = (element) => { const linkElement = element.querySelector('a'); fetchMembershipState() .then(data => { console.log(data); }) .catch(error => { switch (error.statusCode) { default: linkElement.innerHTML = 'Login'; linkElement.href = '/login'; } }); }; class NvidiaApplicationButton extends HTMLElement { constructor() { const template = document.getElementById('application-button-template'); super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(template.content.cloneNode(true)); } connectedCallback() { const element = this._shadowRoot; document.addEventListener('DOMContentLoaded', () => { initApplicationButton(element); }); } } window.customElements.define('nv-application-button', NvidiaApplicationButton); </script> <template id='application-text-template'> <p></p> </template> <script> class NvidiaApplicationText extends HTMLElement { constructor() { const template = document.getElementById('application-text-template'); super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(template.content.cloneNode(true)); } connectedCallback() { } } window.customElements.define('nv-application-text', NvidiaApplicationText); </script> <template id='nv-sf-form-validator-template'> <script src="https://dirms4qsy6412.cloudfront.net/assets/sf-validation/moment-620a5949fff0ad37198f07464b91d7b7c110ecdb6f94ca90ca7d2e1b471f1da8.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/sf-validation/validate.min-2160a65c1b5d4a5966544ad25af8fe99f11c636a99c516fee6c7afd3b1f21409.js"></script> <p></p> </template> <script> class NvidiaSalesforceValidator extends HTMLElement { constructor() { const template = document.getElementById('nv-sf-form-validator-template'); super(); this._shadowRoot = this.attachShadow({'mode': 'open'}); this._shadowRoot.appendChild(template.content.cloneNode(true)); } initComponent() { if (!window.sfv) { return; } validate.extend(validate.validators.datetime, { parse: function (value, options) { if (moment(value, options.format, true).isValid()) { return +moment.utc(value); } }, format: function (value, options) { var format = options.dateOnly ? "MM/DD/YYYY" : "MM/DD/YYYY hh:mm"; return moment.utc(value).format(format); } }); function showErrors(errors) { $.each(errors, function (index, element) { $('input[name="' + errors[index]['attribute'] + '"]').each(function (i, e) { var errorMessage = errors[index]['options']['message']; $('<div class="js-validation-errors">' + errorMessage + '</div>').insertAfter(e); }).focus(); }); } function isValidForm(form, constraints) { var errors = validate(form, constraints, {format: "detailed"}); if (errors) { showErrors(errors); return false; } return true; } $.each(window.sfv, function (index, element) { $(element.target).on('click', function (event) { $('.js-validation-errors').remove(); if (!isValidForm(element.form, element.constraints)) { event.preventDefault(); } }); }); } connectedCallback() { document.addEventListener('DOMContentLoaded', () => { this.initComponent(); }); } } window.customElements.define('nv-sf-form-validator', NvidiaSalesforceValidator); </script> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/d3.v4.min-41cfecdf7c41476e805de7afacf4aacdd1a4be6947fbecf95217e947ebc2faf5.js"></script> <script src="https://dirms4qsy6412.cloudfront.net/assets/horizontal-chart/visualize-d-06443fdef48364af6635f0d1d3535da26910671f6f6a680c531eff0e54ed595f.js"></script> <template id="chart-template"> <style> @import "https://dirms4qsy6412.cloudfront.net/assets/devzone3/modules/nvidia_tokens/nvidia-charts-a459e90d273ab4f8b282e0f5fef607074b5fc7cbb5f8d0f0e378281320e6b9c8.css"; </style> <div class="horizontal-chart-component"> <div class="chart-container"> <h4 class="chart-title"></h4> <p class="chart-subtitle"></p> <div class="legend"></div> <svg data-nvidia-chart="true" data-chart-legend=""></svg> <p class="chart-footnote"></p> </div> </div> </template> <script> function chartInit(element) { const chart = element.querySelector('svg[data-nvidia-chart]'); const isRendered = chart.getAttribute("data-rendered"); if (isRendered) { return; } const svgChart = d3.select(chart); const bars = JSON.parse(chart.dataset['chartBars']); const ticks = JSON.parse(chart.dataset['chartTicks']); const xAxisLabel = chart.dataset['xAxisLabel']; const barPadding = chart.dataset['barPadding']; const milestone = null; const isGrouped = chart.dataset['isGrouped'] === 'true'; if (isGrouped) { const legend = JSON.parse(chart.dataset['chartLegend']); createGroupedHorizontalBarChart(svgChart, bars, barPadding, legend, ticks, milestone, xAxisLabel, false); } else { createHorizontalBarChart(svgChart, bars, barPadding, ticks, xAxisLabel, "", false); } chart.dataset['rendered'] = 'true'; } $('a[data-toggle="tab"]').on("click", function (event) { setTimeout(() => { // Triggering 'resize' event to redraw charts. window.dispatchEvent(new Event('resize')); const target = jQuery(event.target).parents('.nav.nav-tabs').siblings('.tab-content').find('.tab-pane.active'); if (target.length > 0) { const svg = jQuery(target).find('horizontal-chart'); if (svg.length) { svg.each((idx, el) => { setTimeout(function () { const chartContainer = el._shadowRoot.querySelector('.chart-container'); chartInit(chartContainer); }, 300); }); } } }, 50); }); async function loadFileSource(url) { try{ const response = await fetch(url); return response.json(); }catch (e) { console.warn(`Failed to load chart data. URL: ${url}`); } return {}; } class HorizontalChartElement extends HTMLElement { constructor() { const horizontalCharTemplate = document.getElementById('chart-template'); super(); this._shadowRoot = this.attachShadow({ 'mode': 'open' }); this._shadowRoot.appendChild(horizontalCharTemplate.content.cloneNode(true)); } connectedCallback() { const url = this.getAttribute('source'); const element = this._shadowRoot; document.addEventListener("DOMContentLoaded", function () { loadFileSource(url).then(data => { const { chartTitle: title, chartSubtitle: subTitle, chartFootnote: footNote, chartId: id, isGrouped: isGrouped, legendData, barPadding, xAxisLabel, bars, ticks } = data; element.querySelector('.chart-title').innerHTML = title; // Subtitle if (subTitle) { element.querySelector('.chart-subtitle').innerHTML = subTitle; } else { element.querySelector('.chart-subtitle').remove(); } // Chart const svgElement = element.querySelector('.chart-container svg'); svgElement.id = id; const dataAttributes = [ ['isGrouped', isGrouped ? 'true' : 'false', ''], ['chartLegend', JSON.stringify(legendData), ''], ['xAxisLabel', xAxisLabel, ''], ['barPadding', barPadding, 5], ['chartBars', bars, ''], ['chartTicks', ticks, ''], ]; dataAttributes.forEach(dataAttribute => { if (dataAttribute[0] === 'chartBars' && dataAttribute[1]) { dataAttribute[1] = JSON.stringify(dataAttribute[1]); } if (dataAttribute[0] === 'chartTicks' && dataAttribute[1]) { dataAttribute[1] = JSON.stringify(dataAttribute[1]); } svgElement.dataset[dataAttribute[0]] = dataAttribute[1] ? dataAttribute[1] : dataAttribute[2]; }); // Caption if (footNote) { element.querySelector('.chart-footnote').innerHTML = footNote; } else { element.querySelector('.chart-footnote').remove(); } // Init chart const chartContainer = element.querySelector('.chart-container'); setTimeout(function () { if (jQuery(chartContainer).is(':visible')) { chartInit(chartContainer); } }, 300); }); }) } } window.customElements.define('horizontal-chart', HorizontalChartElement); </script> <script src="https://dirms4qsy6412.cloudfront.net/assets/tablefilter/tablefilter-e8295498b8f34d53fbb98264abcc88fb72c57915ee6a13b15361d5df0127ebbb.js"></script> <template id="nv-filtered-table-template"> <div class="nvidia-filtered-table-wrapper"></div> </template> <script> const buildTableIdentity = (function (str) { let counter = 0; return function (str) {counter += 1; return `${str}-${counter}`} })(); function slugify(str) { return String(str) .normalize('NFKD') // split accented characters into their base characters and diacritical marks .replace(/[\u0300-\u036f]/g, '') // remove all the accents, which happen to be all in the \u03xx UNICODE block. .trim() // trim leading or trailing whitespace .toLowerCase() // convert to lowercase .replace(/[^a-z0-9 -]/g, '') // remove non-alphanumeric characters .replace(/\s+/g, '-') // replace spaces with hyphens .replace(/-+/g, '-'); // remove consecutive hyphens } /** * Returns URL params. * * @returns {any|{[p: string]: string}} */ function getUrlParams() { try { return Object.fromEntries(new URLSearchParams(location.search)); } catch (e) { // Fallback for IE11. let search = location.search.substring(1) .replace(/&/g, '","') .replace(/=/g, '":"'); return JSON.parse('{"' + search + '"}', function (key, value) { return key === "" ? value : decodeURIComponent(value); }); } } /** * Query string extension for TableFilter. * * @see http://www.tablefilter.com/extension-run-time.html * * @param {Object} tf * TableFilter instance. * @constructor */ function QueryStringExtension(tf) { this.tf = tf; } QueryStringExtension.prototype.init = function () { let tf = this.tf; tf.emitter.on(['after-filtering'], this.afterFiltering.bind(this)); }; QueryStringExtension.prototype.afterFiltering = function (tf, terms) { const config = tf.cfg; // Get query string. let existingParams = getUrlParams(); // Remove values related to current table. $.each(terms, function (index, element) { let key = config.qs_filters[index]; delete existingParams[config.table_identity + "_" + key]; }); $.each(terms, function (index, element) { if (element.length) { existingParams[config.table_identity + "_" + config.qs_filters[index]] = element; } }); const paramsKeys = Object.keys(existingParams).sort(); let sortedParams = {}; $.each(paramsKeys, function (i, e) { sortedParams[e] = existingParams[e]; }); const params = $.param(sortedParams); const url = window.location.pathname + '?' + decodeURI(params); window.history.replaceState({}, '', url); }; function addQueryStringExtension(tf) { let queryStringExtension = new QueryStringExtension(tf); try { tf.registerExtension(queryStringExtension, 'queryStringExtension'); queryStringExtension.init(); } catch (e) { console.log('Failed to init URL params handler.'); } } /** * Filtered table web component. */ class NvFilteredTableWebComponent extends HTMLElement { constructor() { super(); const elementTemplate = document.getElementById('nv-filtered-table-template'); this._shadowRoot = this.attachShadow({'mode': 'open'}); this._shadowRoot.appendChild(elementTemplate.content.cloneNode(true)); } async loadSourceFile(url) { try { const response = await fetch(url); return response.json(); } catch (e) { console.warn(`Failed to load table data. URL: ${url}`); } return {}; } fetchComponentData = (url, el, hash) => this.loadSourceFile(url).then((data) => this.instantiateComponent(data, el, hash)); getColumnTypes(config) { return Array.from(config).map((col) => { const {columnType} = col; return columnType ? columnType : 'string'; }); } addFilterWidgets(config, headerData) { headerData.forEach((col, idx) => { const {filterWidget} = col; if (filterWidget) { config[`col_${idx}`] = filterWidget; } }); return config; } instantiateComponent(data, element, hash) { const {tableIndex: headerData, tableItems: rowsData, tableIdentity} = data; let filterConfig = { base_path: '/', sticky_headers: true, alternate_rows: true, mark_active_columns: { highlight_column: true, }, loader: true, highlight_keywords: true, no_results_message: true, toolbar: false, help_instructions: false, paging: { results_per_page: ['Records: ', [25, 50, 100]] }, auto_filter: true, responsive: true, grid_layout: { width: '100%', tbl_cont_css_class: 'nvidia-filtered-table' }, clear_filter_text: 'All', col_types: this.getColumnTypes(headerData), extensions: [ {name: ''} ], flt_css_class: 'filter-control', on_filters_loaded: (e) => { const {cfg} = e; if (!cfg) { return; } const {defaultValues} = cfg; if(!Array.isArray(defaultValues)) { return; } if (defaultValues.length === 0) { return; } defaultValues.forEach((defaultValue) => { const {index, value} = defaultValue; let headerCell = document.querySelector('.header-row th[data-idx="' + index + '"]'); if (!headerCell) { return; } const filterIndex = headerCell.dataset['fidx']; e.setFilterValue(filterIndex, value); }); e.filter(); }, qs_filters: headerData.map((item) => { return slugify(item?.columnName); }), }; filterConfig = this.addFilterWidgets(filterConfig, headerData); const id = tableIdentity ? tableIdentity : buildTableIdentity('t'); filterConfig.table_identity = id; const defaultValues = headerData .filter(item => item?.defaultValue !== undefined) .map(item => { return {index: item['column'], value: item['defaultValue']}; }); const filtersMap = headerData.map(item => { const {columnName, column} = item; return { index: column, key: `${id}_${slugify(columnName)}`} }); const sp = new URLSearchParams(location.search); filtersMap.forEach(filter => { if (!sp.has(filter.key)) { return; } defaultValues.push({index: filter.index, value: sp.get(filter.key)}); }); const detail = { hash, headerData, rowsData, defaultValues, filterConfig: { table_identity: id, config: filterConfig, predefined_selects: JSON.stringify([]), labels_width: [], }, }; const event = new CustomEvent('nv.filterTable.build', {detail}); document.dispatchEvent(event); } connectedCallback() { const url = this.getAttribute('source'); const hash = this.getAttribute('data-hash'); const element = this._shadowRoot; document.addEventListener('DOMContentLoaded', () => this.fetchComponentData(url, element, hash)); } } // Register web component. window.customElements.define('nv-filtered-table', NvFilteredTableWebComponent); /** * Builds table header. * * @param {Array} data * @param {HTMLElement} parentElement */ const buildHeader = (data, parentElement) => { data.forEach((item, idx) => { const {column, columnName} = item; const cell = document.createElement('th') cell.dataset['idx'] = column; cell.dataset['fidx'] = idx; cell.innerHTML = columnName; const {labelWidth, columnWidth} = item; if (labelWidth) { cell.dataset['label_width'] = labelWidth; } if (columnWidth && Number.isInteger(columnWidth) && columnWidth > 0) { cell.width = columnWidth + '%'; } else if (columnWidth && (columnWidth.endsWith('em') || columnWidth.endsWith('px') || columnWidth.endsWith('%'))) { cell.width = columnWidth; } parentElement.appendChild(cell); }); } /** * Builds table rows. * * @param {Object} headerData * @param {Array} data * @param {HTMLElement} parentElement */ const buildRows = (headerData, data, parentElement) => { data.forEach(partner => { const {name, logo, URL: partnerUrl, cameras} = partner; const logoCellContent = ` <a href="${partnerUrl}"> <img src="${logo}" alt="${name}" title="${name}" loading="lazy"> </a> <span class="element-invisible">${name}</span> `; cameras.forEach(camera => { const row = document.createElement('tr'); const logoCell = document.createElement('td'); logoCell.innerHTML = logoCellContent; row.appendChild(logoCell); for (const [key, value] of Object.entries(headerData)) { if (!camera[value.column]) { continue; } const cell = document.createElement('td'); let cameraValue = camera[value.column]; let cellHTML = ''; if (typeof cameraValue === 'object') { const {type, product_url, product_img, td_text} = cameraValue let img = ''; if(product_img !== "—") { img = `<img src="${product_img}" alt="${td_text}" title="${td_text}">`; } let html = ` <div class="product-link"> <a href="${product_url}" target="_blank"> ${img} <div class="product-title">${td_text}</div> </a> </div>` cellHTML = html.trim(); } else if (typeof cameraValue === 'string') { cellHTML = cameraValue } cell.innerHTML = cellHTML; row.appendChild(cell); } parentElement.appendChild(row); }) }); } const initTable = (table, filtersConfig, defaultValues) => { filtersConfig.config.defaultValues = defaultValues; const nvidiaFilteredTable = new TableFilter(table, filtersConfig.config); nvidiaFilteredTable.emitter.on(['before-loading-extensions'], addQueryStringExtension); nvidiaFilteredTable.init(); }; document.addEventListener('nv.filterTable.build', (event) => { const {detail} = event; const {headerData, rowsData, filterConfig, hash, defaultValues} = detail; const component = document.querySelector('nv-filtered-table[data-hash="' + hash + '"]'); const element = document.createElement('div'); element.classList.add('nvidia-filtered-table-wrapper'); element.innerHTML = `<div class="table-responsive"><table class="table table-hover table-striped sticky-enabled"><thead></thead><tbody></tbody></table></div>`; component.after(element); const table = element.querySelector('table'); const tableHeader = element.querySelector('table thead'); const tableHeaderRow = document.createElement('tr'); tableHeaderRow.classList.add('header-row'); tableHeader.appendChild(tableHeaderRow); buildHeader(headerData, tableHeaderRow); const tableBody = element.querySelector('table tbody'); buildRows(headerData, rowsData, tableBody); initTable(table, filterConfig, defaultValues); }); </script> <script> let popboxInterval = setInterval(() => { if (window.popBoxRevertImage) { window.popBoxRevertImage = "https://dirms4qsy6412.cloudfront.net/assets/devzone3/popbox/magminus-c3ede3770e34408a899b24e37e367f87386b3cb40e2c101a54ae7f4bd604afea.gif" clearInterval(popboxInterval); } }, 1000); </script> <script src="https://dirms4qsy6412.cloudfront.net/assets/nv-developer-menu-09b6a95e79b8d8d44b0f1ac794e39d5adac82391d128f6d4d39715826a860020.js"></script> <script> let menuLocale = 'en'; if (menuLocale == 'en') { menuLocale = 'en-US'; } function mountHeader(data = false) { let options = { baseURL: window.location.origin, signedIn: false, locale: menuLocale }; if (data) { options.secondaryMenu = data; } options.showMembershipCardLink = true; new NVDeveloperHeader({ target: document.getElementById('header'), props: options }); } function mountFooter(data = false) { let options = { menu: data, locale: menuLocale }; new NVDeveloperFooter({ target: document.getElementById('footer'), props: options }); } let url = 'd29g4g2dyqv443.cloudfront.net'; let headerMenuURL = "https://d29g4g2dyqv443.cloudfront.net/menu/en-US/header-secondary.json"; fetch(headerMenuURL) .then(response => response.json()) .then(data => { mountHeader(data); }) .catch((error) => { mountHeader(); window.nv.tracing.addError('menu', error); }); fetch(`https://${url}/menu/${menuLocale}/footer.json`) .then(response => response.json()) .then(data => { mountFooter(data); }) .catch((error) => { mountFooter(); window.nv.tracing.addError('menu', error); }); </script> <script src="https://www.datadoghq-browser-agent.com/us1/v5/datadog-rum.js"></script> <script> let silentAuthHost = 'www.nvidia.com'; let crossOriginPageUrl = `https://${silentAuthHost}/auth/hints/`; function readHint() { return new Promise((resolve) => { const { origin: targetOrigin } = new URL(crossOriginPageUrl); const iframe = document.createElement('iframe'); iframe.hidden = true; iframe.src = crossOriginPageUrl; function responseHandler(event) { if (event.origin === targetOrigin) { iframe.parentNode.removeChild(iframe); return resolve(event.data); } } window.addEventListener('message', responseHandler, { once: true }); iframe.onload = () => { iframe.contentWindow.postMessage({ type: 'read' }, targetOrigin); } document.body.appendChild(iframe); }); } function writeHint(login_hint, idp_id, timestamp, sub) { const { origin: targetOrigin } = new URL(crossOriginPageUrl); const iframe = document.createElement('iframe'); iframe.hidden = true; iframe.src = crossOriginPageUrl; iframe.onload = () => { const message = { type: 'write', login_hint, idp_id, timestamp, sub }; iframe.contentWindow.postMessage(message, targetOrigin); } document.body.appendChild(iframe); } function deleteHint() { const { origin: targetOrigin } = new URL(crossOriginPageUrl); const iframe = document.createElement('iframe'); iframe.hidden = true; iframe.src = crossOriginPageUrl; iframe.onload = () => { iframe.contentWindow.postMessage({ type: 'delete' }, targetOrigin); } document.body.appendChild(iframe); } </script> <script>_satellite.pageBottom();</script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/runtime-503119e3bfeec75056bc.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/692-70104789368a40f2d231.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/341-3761d2892158034dde54.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/171-72c84e9bea55d778d36a.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/866-f9c34b19d1b60b883caf.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/311-033b6299b51897e65419.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/252-f83b27d9f72fef366bc7.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/582-d6d587645f7c87937f15.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/900-df684e5d2e49c0841d7f.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/application-34e06828c108fa024662.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/ls_track-4ba11c63b23b3f4ff0d5.js" defer="defer"></script> </body> </html>