CINXE.COM
High Performance Computing HPC SDK | 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="UDWlMEHs9MSy_VSY7E193bDM_24x8o-ZviWOZRjcqFs-LUeyWoK0sclPY1ej4pkZr6-hh5oMdX4doVdZyPPw4w" /> <meta name="csp-nonce" /> <title>High Performance Computing HPC SDK | NVIDIA Developer</title> <meta name="keywords" content="hpc, high performance computing, hpc sdk, developer tools, gpu math libraries, c++, fortran, nvidia"> <link rel="canonical" href="https://developer.nvidia.com/hpc-sdk"> <link rel="alternate" href="https://developer.nvidia.com/hpc-sdk" hreflang="x-default"> <link rel="alternate" href="https://developer.nvidia.com/hpc-sdk" hreflang="en-us"> <link rel="alternate" href="https://developer.nvidia.cn/hpc-sdk" hreflang="zh-cn"> <meta property="og:site_name" content="NVIDIA Developer"> <meta property="og:title" content="HPC SDK"> <meta property="og:description" content="Maximize developer productivity and performance of HPC apps."> <meta property="og:type" content="website"> <meta property="og:image" content="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/HPC_SDK/hpc-sdk-sfg-4up-sm_1500x750.png"> <meta property="og:url" content="https://developer.nvidia.com/hpc-sdk"> <meta name="twitter:title" content="NVIDIA HPC SDK"> <meta name="twitter:description" content="A comprehensive suite of compilers, libraries and tools to maximize developer productivity and performance of HPC apps."> <meta name="twitter:image" content="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/HPC_SDK/hpc-sdk-sfg-4up-sm_1500x750.png"> <meta name="twitter:site" content="@NVIDIA"> <meta name="twitter:card" content="summary_large_image"> <meta name="twitter:creator" content="@NVIDIAHPCDev"> <meta property="industry" content="HPC / Scientific Computing"> <link rel="stylesheet" href="https://dirms4qsy6412.cloudfront.net/assets/application-1e91adb0e814253f53c7a621169b6daa7cc975f97befa1c8f1a2ffe493719eb1.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 src="https://dirms4qsy6412.cloudfront.net/assets/onetrust-overrides-v2-9d7d1399c432d702a5bf32a31067737e10c123fdbe5ffef8ae83a34cf2d680ee.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-hpc-sdk" data-id="322"> <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> <style> .dz3-main-section hr { padding: 0 !important; } </style> <video autoplay muted playsinline loop controls width="100%" poster="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/computeworks/images/banners/hpc_videobanner_thumb.png" preload="auto" class="downloadable-files-video-file-player" controlslist="nodownload"> <source src="https://developer.download.nvidia.com/video/HPC/HPC-SDK_KV_1145x220_v005.mp4" type="video/mp4" /> </video> <div class="text-center"> <h1>NVIDIA HPC SDK</h1> <h2 class="h--small">A Comprehensive Suite of Compilers, Libraries and Tools for HPC</h2> </div> <div class="row text-center"> <div class="col-md-10 col-xs-12 col-md-offset-1 "> <p class="lead">The NVIDIA HPC Software Development Kit (SDK) includes the proven compilers, libraries and software tools essential to maximizing developer productivity and the performance and portability of HPC applications.</p> <p class="mb-4"><img alt="NVIDIA HPC SDK Development and Analysis" title="NVIDIA HPC SDK Development and Analysis" class="img-responsive mx-auto" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/hpc-sdk-explainer-diagram-update-r1.png"></p> </div> </div> <div class="row text-center"> <div class="col-md-10 col-xs-12 col-md-offset-1"> <p>The NVIDIA HPC SDK C, C++, and Fortran compilers support GPU acceleration of HPC modeling and simulation applications with standard C++ and Fortran, OpenACC® directives, and CUDA®. GPU-accelerated math libraries maximize performance on common HPC algorithms, and optimized communications libraries enable standards-based multi-GPU and scalable systems programming. Performance profiling and debugging tools simplify porting and optimization of HPC applications, and containerization tools enable easy deployment on-premises or in the cloud. With support for NVIDIA GPUs and Arm, OpenPOWER, or x86-64 CPUs running Linux, the HPC SDK provides the tools you need to build NVIDIA GPU-accelerated HPC applications.</p> <p> <a class="btn btn-success" href="https://developer.nvidia.com/nvidia-hpc-sdk-downloads">Download Now</a> <a class="btn" href="https://catalog.ngc.nvidia.com/orgs/nvidia/containers/nvhpc" target="_blank">Get Container</a> </p> </div> </div> <hr class="my-5"> <h2 class="text-center">Why Use the NVIDIA HPC SDK?</h2> <div class="row"> <div class="col-xs-12 col-md-4"> <h3 class="h--small">Performance</h3> <p>Widely used HPC applications, including VASP, Gaussian, ANSYS Fluent, GROMACS, and NAMD, use CUDA, OpenACC, and GPU-accelerated math libraries to deliver breakthrough performance to their users. You can use these same software tools to GPU-accelerate your applications and achieve dramatic speedups and power efficiency using NVIDIA GPUs. </p> </div> <div class="col-xs-12 col-md-4"> <h3 class="h--small">Portability</h3> <p>Build and optimize applications for over 99 percent of today's Top500 systems, including those based on NVIDIA GPUs or x86-64, Arm or OpenPOWER CPUs. You can use drop-in libraries, C++17 parallel algorithms and OpenACC directives to GPU accelerate your code and ensure your applications are fully portable to other compilers and systems.</p> </div> <div class="col-xs-12 col-md-4"> <h3 class="h--small">Productivity</h3> <p>Maximize science and engineering throughput and minimize coding time with a single integrated suite that allows you to quickly port, parallelize and optimize for GPU acceleration, including industry-standard communication libraries for multi-GPU and scalable computing, and profiling and debugging tools for analysis.</p> </div> </div> <hr class="my-5"> <h2 class="text-center">Support for Your Favorite Programming Languages</h2> <div class="row"> <div class="col-xs-12 col-md-4"> <h3 class="h--small">C++17 Parallel Algorithms</h3> <p>C++17 parallel algorithms enable portable parallel programming using the Standard Template Library (STL). The NVIDIA HPC SDK C++ compiler supports full C++17 on CPUs and offloading of parallel algorithms to NVIDIA GPUs, enabling GPU programming with no directives, pragmas, or annotations. Programs that use C++17 parallel algorithms are readily portable to most C++ implementations for Linux, Windows, and macOS.</p> </div> <div class="col-xs-12 col-md-4"> <h3 class="h--small">Fortran 2003 Compiler</h3> <p>The NVIDIA Fortran compiler supports Fortran 2003 and many features of Fortran 2008. With support for OpenACC and <a href="/cuda-fortran">CUDA Fortran</a> on NVIDIA GPUs, and SIMD vectorization, OpenACC and OpenMP for multicore x86-64, Arm, and OpenPOWER CPUs, it has the features you need to port and optimize your Fortran applications on today’s heterogeneous GPU-accelerated HPC systems.</p> </div> <div class="col-xs-12 col-md-4"> <h3 class="h--small">OpenACC Directives</h3> <p>NVIDIA Fortran, C, and, C++ compilers support OpenACC directive-based parallel programming for NVIDIA GPUs and multicore CPUs. Over 200 HPC application ports have been initiated or enabled using OpenACC, including production applications like VASP, Gaussian, ANSYS Fluent, WRF, and MPAS. OpenACC is the proven performance-portable directives solution for GPUs and multicore CPUs.</p> </div> </div> <hr class="my-5"> <h2 class="text-center">Key Features</h2> <div class="row my-4"> <div class="col-xs-12 col-md-6"> <img alt=" NVIDIA HPC SDK includes a suite of GPU-accelerated math libraries" title=" NVIDIA HPC SDK includes a suite of GPU-accelerated math libraries" class="img-responsive mx-auto" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/cuda-x-libraries.svg"> </div> <div class="col-xs-12 col-md-6"> <h3>GPU Math Libraries</h3> <p>The NVIDIA HPC SDK includes a suite of <a href="https://developer.nvidia.com/gpu-accelerated-libraries#linear-algebra">GPU-accelerated math libraries</a> for compute-intensive applications. The cuBLAS and cuSOLVER libraries provide GPU-optimized and multi-GPU implementations of all BLAS routines and core routines from LAPACK, automatically using NVIDIA GPU Tensor Cores where possible. cuFFT includes GPU-accelerated 1D, 2D, and 3D FFT routines for real and complex data, and cuSPARSE provides basic linear algebra subroutines for sparse matrices. These libraries are callable from CUDA and OpenACC programs written in C, C++ and Fortran.</p> </div> </div> <div class="row my-4"> <div class="col-xs-12 col-md-6"> <h3>Optimized for Tensor Cores</h3> <p>NVIDIA GPU Tensor Cores enable scientists and engineers to dramatically accelerate suitable algorithms using mixed precision or double precision. The NVIDIA HPC SDK math libraries are optimized for Tensor Cores and multi-GPU nodes to deliver the full performance potential of your system with minimal coding effort. Using the NVIDIA Fortran compiler, you can leverage Tensor Cores through automatic mapping of transformational array intrinsics to the cuTENSOR library.</p> <p>Technical Blog: <a href="https://developer.nvidia.com/blog/bringing-tensor-cores-to-standard-fortran/" target="_blank">Bringing Tensor Cores to Standard Fortran</a></p> </div> <div class="col-xs-12 col-md-6"> <img alt=" NVIDIA A100 Tensor Core FP64" title=" NVIDIA A100 Tensor Core FP64" class="img-responsive mx-auto" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/HPC_SDK/A100_TensorCore_FP64.jpg"> </div> </div> <div class="row my-4"> <div class="col-xs-12 col-md-6"> <img alt="NVIDIA HPC compilers and tools are optimized for your CPU" title="NVIDIA HPC compilers and tools are optimized for your CPU" class="img-responsive mx-auto" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/optimized-for-cpu.svg"> </div> <div class="col-xs-12 col-md-6"> <h3>Optimized for Your CPU</h3> <p>Heterogeneous HPC servers use GPUs for accelerated computing and multicore CPUs based on the x86-64, OpenPOWER or Arm instruction set architectures. <a href="/hpc-compilers">NVIDIA HPC compilers</a> and tools are supported on all of these CPUs, and all compiler optimizations are fully enabled on any CPU that supports them. With uniform features, command-line options, language implementations, programming models, and tool and library user interfaces across all supported systems, the NVIDIA HPC SDK simplifies the developer experience in diverse HPC environments. </p> </div> </div> <div class="row my-4"> <div class="col-xs-12 col-md-6"> <h3>Multi-GPU Programming</h3> <p>The NVIDIA Collective Communications Library (NCCL) implements highly optimized multi-GPU and multi-node collective communication primitives using MPI-compatible all-gather, all-reduce, broadcast, reduce, and reduce-scatter routines to take advantage of all available GPUs within and across your HPC server nodes. NVSHMEM implements the OpenSHMEM standard for GPU memory and provides multi-GPU and multi-node communication primitives that can be initiated from a host CPU or GPU and called from within a CUDA kernel.</p> </div> <div class="col-xs-12 col-md-6"> <img alt="NVIDIA Collective Communications Library (NCCL) implements multi-GPU programming" title="NVIDIA Collective Communications Library (NCCL) implements multi-GPU programming" class="img-responsive" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/multi-gpu-programming.svg"> </div> </div> <div class="row my-4"> <div class="col-xs-12 col-md-6"> <img alt="NVIDIA HPC SDK includes a MPI library for scalable systems programming" title="NVIDIA HPC SDK includes a MPI library for scalable systems programming" class="img-responsive mx-auto" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/scalable-system-programming.jpg"> </div> <div class="col-xs-12 col-md-6"> <h3>Scalable Systems Programming</h3> <p>MPI is the standard for programming distributed-memory scalable systems. The NVIDIA HPC SDK includes a CUDA-aware MPI library based on Open MPI with support for GPUDirect™ so you can send and receive GPU buffers directly using remote direct memory access (RDMA), including buffers allocated in CUDA Unified Memory. CUDA-aware Open MPI is fully compatible with CUDA C/C++, CUDA Fortran and the NVIDIA OpenACC compilers.</p> </div> </div> <div class="row my-4"> <div class="col-xs-12 col-md-6"> <h3>Nsight Performance Profiling</h3> <p>Nsight™ Systems provides system-wide visualization of application performance on HPC servers and enables you to optimize away bottlenecks and scale parallel applications across multicore CPUs and GPUs. Nsight Compute allows you to deep dive into GPU kernels in an interactive profiler for GPU-accelerated applications via a graphical or command-line user interface, and allows you to pinpoint performance bottlenecks using the NVTX API to directly instrument regions of your source code.</p> </div> <div class="col-xs-12 col-md-6"> <img alt="Nsight systems provides visualization of app performance on HPC servers" title="Nsight systems provides visualization of app performance on HPC servers" class="img-responsive mx-auto" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/nsight-performance-profiling.jpg"> </div> </div> <div class="row my-4"> <div class="col-xs-12 col-md-6"> <img alt="NVIDIA HPC SDK can deploy software anywhere using the HPC Container Maker" title="NVIDIA HPC SDK can deploy software anywhere using the HPC Container Maker" class="img-responsive mx-auto" src="https://d29g4g2dyqv443.cloudfront.net/sites/default/files/akamai/nvidia-gpu-cloud-hpc-apps-kv-16x9.jpg"> </div> <div class="col-xs-12 col-md-6"> <h3>Deploy Anywhere</h3> <p><a href="https://developer.nvidia.com/ai-hpc-containers">Containers</a> simplify software deployment by bundling applications and their dependencies into portable virtual environments. The NVIDIA HPC SDK includes instructions for developing, profiling, and deploying software using the HPC Container Maker to simplify the creation of container images. The NVIDIA Container Runtime enables seamless GPU support in virtually all container frameworks, including Docker and Singularity.</p> Technical blog: <a href="https://developer.nvidia.com/blog/building-and-deploying-hpc-applications-using-hpc-sdk-from-ngc-catalog/" target="_blank">Building and Deploying HPC Applications using NVIDIA HPC SDK from the NVIDIA NGC Catalog</a>. </div> </div> <hr class="my-5"> <h2 class="text-center">What Users are Saying</h2> <div class="row"> <div class="col-md-8 col-xs-12 col-md-offset-2 text-center"> <p><i>“On Perlmutter, we need Fortran, C and C++ compilers that support all the programming models our users need and expect on NVIDIA GPUs and AMD EPYC CPUs — MPI, OpenMP, OpenACC, CUDA and optimized math libraries. The NVIDIA HPC SDK checks all of those boxes.”</i></p> <small><b>– Nicholas Wright, NERSC Chief Architect</b></small> </div> </div> <br> <hr id="support-services" class="my-5"> <h2 class="text-center">HPC Compilers Support Services</h2> <div class="row"> <div class="col-md-6 col-xs-12 col-md-offset-3"> <p>HPC Compiler Support Services provide access to NVIDIA technical experts, including:</p> <ul> <li>Paid technical support for the NVFORTRAN, NVC++ and NVC compilers (NVCC excluded).</li> <li>Help with installation and usage of NVFORTRAN, NVC++ and NVC compilers.</li> <li>Confirmation of bug reports, prioritization of bug fixes above those from non-paid users.</li> <li>Where possible, help with temporary workarounds for confirmed compiler bugs.</li> <li>Access to release archives including both HPC SDK and legacy PGI packages.</li> <li>For more details please refer to <a href="http://docs.nvidia.com/hpc-sdk/compilers/hcss-terms-and-conditions/index.html" target="_blank">End Customer Terms & Conditions.</a> </li> </ul> <h3>Get Started</h3> <ul> <li>Interested in purchasing the support offer? <a href="mailto:enterpriseservices@nvidia.com">Contact us</a>. </li> <li>Already have an active support contract and already registered for support? Log in to the <a href="https://nvid.nvidia.com/dashboard">NVIDIA support portal</a>.</li> <li>Existing customer and want to renew your contract? <a href="mailto:renewalsales@nvidia.com?subject=Renewing%20HPC%20Compilers%20Support%20Services">Contact us</a>. </li> <li>Questions? Learn more by sending email to <a href="mailto:enterpriseservices@nvidia.com?subject=HPC%20Compilers%20Support%20Services%20Question">enterpriseservices@nvidia.com</a>. </li> </ul> </div> </div> <hr class="my-5"> <h2 class="text-center">Featured Content</h2> <div class="container"> <div class="row"> <div class="col-12" style="margin-top: 1em; margin-bottom: 1em;"> <div id="nvidia-gallery-widget1" class="widget"></div> </div> </div> </div> <script> window.nodWidgets = [{ id: 'nvidia-gallery-widget1', destination: 'https://www.nvidia.com/en-us/on-demand/playlist/playList-f84e9eab-3902-4824-a54a-1db4b0d943d7/', type: 'playlist', playlistId: 'playList-f84e9eab-3902-4824-a54a-1db4b0d943d7', header: 'Featured Content', }]; </script> <div class="panel panel-default"> <div class="panel-body"> <h2 class="text-center">Resources</h2> <div class="row"> <div class="col-md-8 col-xs-12 col-md-offset-2"> <ul> <li><a href="https://docs.nvidia.com/hpc-sdk/index.html" target="_blank"> HPC SDK Documentation</a></li> <li><a href="https://forums.developer.nvidia.com/" target="_blank"> Developer Forums</a></li> <li> Training: <ul> <li><a target="_blank" href="https://www.nvidia.com/en-us/on-demand/session/gtcspring23-dlit51170/">Portable Acceleration of HPC Applications using ISO C++ - Part 1: Fundamentals</a></li> <li><a target="_blank" href="https://www.nvidia.com/en-us/on-demand/session/gtcspring23-dlit51170/">Portable Acceleration of HPC Applications using ISO C++ - Part 2: Fundamentals</a></li> <li><a target="_blank" href="https://courses.nvidia.com/courses/course-v1:DLI+S-AC-09+V1/">Scaling GPU-Accelerated Applications with the C++ Standard Library</a></li> </ul> </li> <li><a target="_blank" href="https://www.openhackathons.org/s/">GPU Hackathons and Bootcamps</a></li> <li> Industry Articles: <ul> <li><a target="_blank" href="https://www.hpcwire.com/2022/09/05/why-standards-based-parallel-programming-should-be-in-your-hpc-toolbox/?=&linkId=100000147318917">Why Standards-Based Parallel Programming Should be in Your HPC Toolbox</a></li> <li><a target="_blank" href="https://www.hpcwire.com/2022/10/03/leveraging-standards-based-parallel-programming-in-hpc-applications/">Leveraging Standards-Based Parallel Programming in HPC Applications</a></li> <li><a target="_blank" href="https://www.hpcwire.com/2022/12/05/new-c-sender-library-enables-portable-asynchrony/">New C++ Sender Library Enables Portable Asynchrony</a></li> </ul> </li> <li> Technical Blogs: <ul> <li><a href="/blog/developing-accelerated-code-with-standard-language-parallelism/" target="_blank"> Developing Accelerated Code with Standard Language Parallelism</a></li> <li><a href="/blog/multi-gpu-programming-with-standard-parallel-c-part-1/" target="_blank">Multi-GPU Programming with Standard Parallel C++: Part One</a></li> <li><a href="/blog/multi-gpu-programming-with-standard-parallel-c-part-2/" target="_blank">Multi-GPU Programming with Standard Parallel C++: Part Two</a></li> <li><a href="/blog/using-fortran-standard-parallel-programming-for-gpu-acceleration/" target="_blank">Using Fortran Standard Parallel Programming for GPU Acceleration</a></li> <li><a href="/blog/n-ways-to-saxpy-demonstrating-the-breadth-of-gpu-programming-options" target="_blank"> N Ways to SAXPY: Demonstrating the Breadth of GPU Programming Options</a></li> <li><a href="/blog/accelerating-standard-c-with-gpus-using-stdpar/" target="_blank"> Accelerating Standard C++ with GPUs Using stdpar</a></li> <li><a href="/blog/accelerating-fortran-do-concurrent-with-gpus-and-the-nvidia-hpc-sdk/" target="_blank"> Accelerating Fortran DO CONCURRENT with GPUs and the NVIDIA HPC SDK</a></li> <li><a href="/blog/bringing-tensor-cores-to-standard-fortran/" target="_blank"> Bringing Tensor Cores to Standard Fortran</a></li> <li><a href="/blog/building-and-deploying-hpc-applications-using-hpc-sdk-from-ngc-catalog/" target="_blank"> Building and Deploying HPC Applications Using NVIDIA HPC SDK from the NVIDIA NGC Catalog</a></li> <li><a href="/blog/accelerating-python-on-gpus-with-nvc-and-cython/">Accelerating Python on GPUs with nvc++ and Cython</a></li> <li><a href="/blog/multinode-multi-gpu-using-nvidia-cufftmp-ffts-at-scale/">Multinode Multi-GPU: Using NVIDIA cuFFTMp FFTs at Scale</a></li> <li><a href="/blog/extending-block-cyclic-tensors-for-multi-gpu-with-nvidia-cutensormg/">Extending Block-Cyclic Tensors for Multi-GPU with NVIDIA cuTensorMg</a></li> <li><a href="/blog/accelerating-gpu-applications-with-nvidia-math-libraries/">Accelerating GPU Applications with NVIDIA Math Libraries</a></li> <li><a href="/blog/accelerating-nvidia-hpc-software-with-sve-on-aws-graviton3/?ncid=so-twit-562255#cid=hpc06_so-twit_en-us">Accelerating NVIDIA HPC Software with SVE on AWS Graviton3</a></li> </ul> </li> <li> Presentations: <ul> <li><a href="https://www.youtube.com/watch?v=DrvI2gw3tnI" target="_blank">Standard Fortran on GPUs and its Utility in Quantum Chemistry Codes</a></li> </ul> </li> <li> Related libraries and software: <ul> <li><a href="/gpudirect" target="_blank">NVIDIA GPUDirect®</a></li> <li><a href="https://www.nvidia.com/en-us/data-center/magnum-io/" target="_blank">Magnum IO</a></li> </ul> </li> </ul> </div> </div> </div> </div> <h2 class="text-center">Get Started</h2> <p class="text-center"><a class="btn btn-success" href="/nvidia-hpc-sdk-downloads" target="_blank">Download</a></p> </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="nv-modal" class="nv-modal nv-modal--closed"> <div class="container"> <div class="col-xl-8 offset-xl-2 col-lg-12 col-md-12 col-sm-12"> <div class="nv-modal__content"> <button type="button" class="modal-form__close js-close-button" aria-label="Close"> <svg width="10" height="10" viewBox="0 0 10 10" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M9.18359 1.49609L5.90234 4.75L9.15625 8.00391L9.62109 8.46875L8.71875 9.39844L8.25391 8.93359L5 5.67969L1.74609 8.93359L1.28125 9.39844L0.351562 8.46875L0.816406 8.00391L4.07031 4.75L0.816406 1.49609L0.351562 1.03125L1.28125 0.101562L1.74609 0.566406L5 3.84766L8.25391 0.59375L8.71875 0.128906L9.64844 1.03125L9.18359 1.49609Z" fill="white"/> </svg> </button> <div id="modal-header" class="nv-modal__header"> </div> <div class="nv-modal__body"> <div data-react-class="Webform" data-react-props="{"formId":189}" data-react-cache-id="Webform-0"></div> </div> </div> </div> </div> </div> <div class="nv-modal-backdrop"></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 type="text/javascript" charset="utf-8"> const nvModalConfig = { cookieName: 'hpc', cookieExpiration: '90' } </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/798-8f26177f1189c7399fb3.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/367-0b2e82a8016bebbc82b5.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/900-34f3bf570904cbfb5a16.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/application-54bf18784eb1ee5cdece.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/ls_track-4ba11c63b23b3f4ff0d5.js" defer="defer"></script> <script src="https://dirms4qsy6412.cloudfront.net/packs/js/nv-modal-43f8e3ca7b0b1d3fde73.js" defer="defer"></script> </body> </html>