Expanze Nvidie pokračuje. Roční tržby skoro 29 miliard $, jen za 1. kvartál už čeká přes 8 miliard

21. 2. 2022

Sdílet

CEO Nvidia Jen-Hsun Huang Autor: Nvidia
CEO Nvidia Jen-Hsun Huang
Je Nvidia nezastavitelná? Tržby a zisky zase stouply, teď běžící kvartál už půjde přes osm miliard dolarů...

Letos jsme již psali o finančních výsledcích InteluAMD v roce 2021. Nvidia, která má účetnictví o 11 měsíců posunuté, skončila svůj účetní rok (v jejím počítání už je to rok 2022) až na konci ledna, a tak její uzávěrka přichází až teď. A opět je to bezprecedentní.

Nvidia zaznamenala absolutně rekordní úspěchy už v třetím kvartálu (srpen až říjen), kdy se jí tržby vyhouply na 7,1 miliardy a čistý zisk na 2,46 miliardy dolarů. Teď sice pro firmu přišly špatné zprávy, kdy zkolaboval její pokus koupit ARM, ale prodeje a výdělky se ve čtvrtém kvartálu (listopad až leden) vydařily mimořádně.

Nvidia dosáhla tržeb ve výši 7,643 miliardy dolarů, což je o 53 % více, než za stejný kvartál o rok zpět (listopad 2020 až leden 2021). Proti rekordnímu třetímu kvartálu tedy Nvidia mezičtvrtletně narostla ještě o 8 %. Pro srovnání, odhad Nvidie na tento kvartál byl 7,4 miliardy dolarů plus minus dvě procenta (7,25–7,55 miliardy), takže firma ještě o něco překonala horní hranici. Čistý zisk byl 3,003 miliardy dolarů, 1,18 dolaru na akcii.

Tržby Nvidie za Q4 FY2022 Tržby Nvidie za Q4 FY2022 (Zdroj: Nvidia)

Meziročně zisk narostl o 106 % s hrubou marží 65,4 %. Zásluhu na tom opět mají i velmi nízké daně, které firma platí, její hrubý zisk před zdaněním byl dokonce nižší než čistý, 2,97 miliardy a její daňová sazba vycházela na minus 4,8 %. Místo placení Nvidia získala vyplacený bonus 138 milionů dolarů (asi spojený s vyplácením zaměstnanců v akciích a další zvláštnosti amerického daňového systému).

Velké nárůsty prodeje GPU ve všech segmentech

Z tržeb přisuzuje Nvidia 4,418 miliardy dolarů grafickým produktům a 3,225 miliardy serverovým a výpočetním produktům. Podle rozdělení trhu bylo 3,42 miliardy dolarů z herní oblasti, což bylo zvýšení oproti 37 % proti stavu o rok předtím a mělo by to odrážet, jak velký je hlad po GPU (a asi také jejich zvýšené ceny). 3,263 miliardy je z datacenter (meziroční nárůst o 71 %).

Tržby Nvidie za Q4 FY2022 jednotlivé segmenty Tržby Nvidie za Q4 FY2022, jednotlivé segmenty(Zdroj: Nvidia)

O 109 % (na 643 milionů $) ale také narostly tržby z profesionálních grafických karet, tj. bývalá řada grafik Quadro – je možné, že jejich tržby a ceny šly z části také nahoru proto, že herních GPU bylo málo a část zákazníků proto vzala profi kartu, které by se jinak vyhnuli kvůli její vyšší ceně. Poměrně drobné tržby jsou z automobilů, jen 125 milionů (meziroční pokles o 14 %) a z OEM segmentu (192 milionů).

Nvidia GeForce GPU ilustrace 1600 Nvidia GeForce (Zdroj: Nvidia)

Roční tržby Nvidie už jsou skoro 27 miliard dolarů

Tržby za celý (účetní) rok dosáhly 26,914 miliardy $, proti předešlému účetnímu roku je to nárůst o 61 %. Čistý zisk byl 9,752 miliardy dolarů (na jednu akcii 3,85 $), při hrubé marži 64,9 %. Za celý účetní rok jinak vycházela Nvidii daňová sazba 1,9 % a firma zaplatila na dani za celý rok 189 milionů dolarů…

Tržby Nvidie za FY2022 Tržby Nvidie za účetní rok FY2022 (Zdroj: Nvidia)

Příště už 8 miliard

Expanze Nvidie se ale zdaleka nezastavila. Půl roku po tom, co poprvé překonala hranici 7 miliard dolarů tržeb za kvartál, má zřejmě překonat také hranici 8 miliard. Za první kvartál fiskálního roku 2023 (což bude letošní únor až duben) odhaduje tržby 8,1 miliardy dolarů – opět je to s tolerancí plus minus dvě procenta (7,94–8,26 miliardy) a protože se zase asi dá očekávat překročení, můžeme neformálně hádat i něco jako 8,35–8,45 miliardy. Pokud tedy nedojde k nějakému prasknutí bubliny kryptoměn a kolapsu prodeje GPU, což by teoreticky mohlo udělat výpadek tržeb už v běžícím kvartále, i když hlavní bolest by asi pak přišla až v následujících.

docker + kubernetes školení s dotací tip

Pokud by už v prvním kvartále Nvidia měla tržby přes osm miliard, mohla by se možná za celý rok dostat až na nějakých 35 miliard dolarů tržeb. Ovšem celoroční odhad zatím firma žádný nedává, takže teprve uvidíme.

Tržby Nvidie za Q4 FY2022 trend tržeb za posledních osm čtvrtletí Tržby Nvidie za Q4 FY2022: trend tržeb za posledních osm čtvrtletí(Zdroj: Nvidia)

Zdroje: Nvidia (1, 2, 3)

Autor článku

Redaktor portálu Cnews.cz. Zaměřuje se na procesory, mobilní SoC, grafické karty, disky a další počítačový hardware. Profil autora →

'; document.getElementById('outstream-iframe').onload = function () { setupIframe(); } replayScreen = document.getElementById('iinfoOutstreamReplay'); iinfoOutstreamPosition = document.getElementById('iinfoOutstreamPosition'); outstreamContainer = document.getElementsByClassName('outstream-container')[0]; setupReplayScreen(); } function setupIframe() { outstreamDocument = document.getElementById('outstream-iframe').contentWindow.document; let el = outstreamDocument.createElement('style'); outstreamDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:-5px;right:25px}"; videoContent = outstreamDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; if ( location.href.indexOf('rejstriky.finance.cz') !== -1 || location.href.indexOf('finance-rejstrik') !== -1 || location.href.indexOf('firmy.euro.cz') !== -1 || location.href.indexOf('euro-rejstrik') !== -1 || location.href.indexOf('/rejstrik/') !== -1 || location.href.indexOf('/rejstrik-firem/') !== -1) { outstreamDirectPlayed = true; soundAllowed = true; iinfoVastUrlIndex = 0; } if (!outstreamDirectPlayed) { console.log('OUTSTREAM direct'); setUpIMA(true); } else { if (soundAllowed) { const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('OUTSTREAM sound allowed'); setUpIMA(false); }).catch(function () { console.log('OUTSTREAM sound forbidden'); renderBanner(); }); } } else { renderBanner(); } } } function getWrapper() { let articleWrapper = document.querySelector('.rs-outstream-placeholder'); // Outstream Placeholder from RedSys manipulation if (articleWrapper && articleWrapper.style.display !== 'block') { articleWrapper.innerHTML = ""; articleWrapper.style.display = 'block'; } // Don't render OutStream on homepages if (articleWrapper === null) { if (document.querySelector('body.p-index')) { return null; } } if (articleWrapper === null) { articleWrapper = document.getElementById('iinfo-outstream'); } if (articleWrapper === null) { articleWrapper = document.querySelector('.layout-main__content .detail__article p:nth-of-type(6)'); } if (articleWrapper === null) { // Euro, Autobible, Zdravi articleWrapper = document.querySelector('.o-article .o-article__text p:nth-of-type(6)'); } if (articleWrapper === null) { articleWrapper = document.getElementById('sidebar'); } if (!articleWrapper) { console.error("Outstream wrapper of article was not found."); } return articleWrapper; } function setupDimensions() { outstreamWidth = Math.min(iinfoOutstreamPosition.offsetWidth, 480); outstreamHeight = Math.min(iinfoOutstreamPosition.offsetHeight, 320); } /** * Sets up IMA ad display container, ads loader, and makes an ad request. */ function setUpIMA(direct) { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); if (direct) { adsRequest.adTagUrl = directVast; console.log('Outstream DIRECT CAMPAING advert: ' + directVast); videoContent.muted = true; videoContent.volume = 0; outstreamDirectPlayed = true; } else { adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Outstream advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; } // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = outstreamWidth; // adsRequest.linearAdSlotHeight = outstreamHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function setupReplayScreen() { replayScreen.addEventListener('click', function () { iinfoOutstreamPosition.remove(); iinfoVastUrlIndex = 0; outstreamInit(); }); } /** * Sets the 'adContainer' div as the IMA ad display container. */ function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. outstreamDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( outstreamDocument.getElementById('adContainer'), videoContent); } function unmuteAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); outstreamDocument.getElementById('adMuteBtn').innerHTML = ''; } } /** * Loads the video content and initializes IMA ad playback. */ function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(outstreamWidth, outstreamHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } /** * Handles the ad manager loading and sets ad event listeners. * @param { !google.ima.AdsManagerLoadedEvent } adsManagerLoadedEvent */ function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } /** * Handles actions taken in response to ad events. * @param { !google.ima.AdEvent } adEvent */ function onAdEvent(adEvent) { // Retrieve the ad from the event. Some events (for example, // ALL_ADS_COMPLETED) don't have ad object associated. const ad = adEvent.getAd(); console.log('Outstream event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: // This is the first event sent for an ad - it is possible to // determine whether the ad is a video ad or an overlay. if (!ad.isLinear()) { // Position AdDisplayContainer correctly for overlay. // Use ad.width and ad.height. videoContent.play(); } outstreamDocument.getElementById('adContainer').style.width = '100%'; outstreamDocument.getElementById('adContainer').style.maxWidth = '640px'; outstreamDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); // This event indicates the ad has started - the video player // can adjust the UI, for example display a pause button and // remaining time. if (ad.isLinear()) { // For a linear ad, a timer can be started to poll for // the remaining time. intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } outstreamDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (outstreamLastError === 303) { if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } } break; case google.ima.AdEvent.Type.COMPLETE: // This event indicates the ad has finished - the video player // can perform appropriate UI actions, such as removing the timer for // remaining time detection. if (ad.isLinear()) { clearInterval(intervalTimer); } if (isBanner) { renderBanner(); } else { replayScreen.style.display = 'flex'; } break; } } /** * Handles ad errors. * @param { !google.ima.AdErrorEvent } adErrorEvent */ function onAdError(adErrorEvent) { // Handle the error logging. console.log(adErrorEvent.getError()); outstreamLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { renderBanner(); } } function renderBanner() { if (isBanner) { console.log('Outstream: Render Banner'); iinfoOutstreamPosition.innerHTML = ""; iinfoOutstreamPosition.style.height = "330px"; iinfoOutstreamPosition.appendChild(bannerDiv); } else { console.log('Outstream: Banner is not set'); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoOutstreamPosition.remove(); outstreamInit(); } else { return false; } adVolume = 1; return true; } /** * Pauses video content and sets up ad UI. */ function onContentPauseRequested() { videoContent.pause(); // This function is where you should setup UI for showing ads (for example, // display ad timer countdown, disable seeking and more.) // setupUIForAds(); } /** * Resumes video content and removes ad UI. */ function onContentResumeRequested() { videoContent.play(); // This function is where you should ensure that your UI is ready // to play content. It is the responsibility of the Publisher to // implement this function when necessary. // setupUIForContent(); } function onActiveView() { if (outstreamContainer) { const containerOffset = outstreamContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (outstreamPaused) { adsManager.resume(); outstreamPaused = false; } return true; } else { if (!outstreamPaused) { adsManager.pause(); outstreamPaused = true; } } } return false; } let outstreamInitInterval; if (typeof cpexPackage !== "undefined") { outstreamInitInterval = setInterval(tryToInitializeOutstream, 100); } else { const wrapper = getWrapper(); if (wrapper) { let outstreamInitialized = false; window.addEventListener('scroll', () => { if (!outstreamInitialized) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { outstreamInit(); outstreamInitialized = true; } } }); } } function tryToInitializeOutstream() { const wrapper = getWrapper(); if (wrapper) { const containerOffset = wrapper.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight / 1 && containerOffset.bottom > 0.0) { if (cpexPackage.adserver.displayed) { clearInterval(outstreamInitInterval); outstreamInit(); } } } else { clearInterval(outstreamInitInterval); } } }
OSZAR »