Kysymys:
PCI Express -väylän käytön seuranta
Franck Dernoncourt
2016-10-07 02:56:45 UTC
view on stackexchange narkive permalink

Etsin ohjelmaa, joka voi seurata PCI Express -väylän käyttöä Linuxissa. Olen kiinnostunut enimmäkseen PCI Express -väylän käytöstä Nvidia-näytönohjaimen ja suorittimen välillä.


Olen tietoinen https://devblogs.nvidia.com/parallelforall/how-optimize- data-transfer-cuda-cc /, joka antaa koodinpätkän ( bandwidthtest.cu ) tiedonsiirtonopeuden mittaamiseksi GPU: n ja suorittimen välillä:

  / * Tekijänoikeudet (c) 1993-2015, NVIDIA CORPORATION. Kaikki oikeudet pidätetään. * * Uudelleenjako ja käyttö lähde- ja binaarimuodoissa, muokkaamalla tai muokkaamatta, ovat sallittuja, jos seuraavat ehdot * täyttyvät: * * Lähdekoodin uudelleenjakelun on säilytettävä yllä oleva tekijänoikeusilmoitus *, tämä ehtoluettelo ja seuraava vastuuvapauslauseke . * * Binaarimuodossa olevien jakelujen on toistettava yllä oleva tekijänoikeusilmoitus *, tämä ehtoluettelo ja seuraava vastuuvapauslauseke jakelun mukana toimitetuissa * asiakirjoissa ja / tai muissa materiaaleissa. * * NVIDIA CORPORATIONin nimeä tai sen * avustajien nimiä ei saa käyttää tukemaan tai mainostamaan tästä ohjelmistosta * peräisin olevia tuotteita ilman erillistä kirjallista lupaa. * * TÄMÄN OHJELMISTON TARJOAVAT TEKIJÄNOIKEUDEN HALTIJAT '' SELLAISENAAN '' JA KAIKKI * ILMAISET TAI OLETTAVAT TAKUUDET, MUKAAN LUKIEN MUKAAN, MUTTA RAJOITTAMATTOMAT * TARPEET MYYNTIKELPOISUUDESTA JA SOVELTUVUUDESTA ERITYISESTI * TARPEEN A. TEKIJÄN OIKEUDEN OMISTAJA TAI * OSALLISTAJAT OVAT VASTUULLA MISTÄÄN SUORISTA, EPÄSUORISTA, SATUNNAISISTA, ERIKOISISTA, * ESIMERKKEISISTÄ TAI SEURAAVISISTA VAHINGOISTA (MUKAAN MUKAAN MUTTA RAJOITTAMATTOMIA, * AINEISTOTAVAROIDEN, PALVELUJEN, PALVELUJEN HANKINTA; TAI * VOITOT; TAI LIIKETOIMINNAN TAPAHTUMA) SITÄ SYÖTTÖMISEKSI JA MISSÄÄN VASTUUTEORIASSA * SOPIMUKSESSA, RAJOITETUSSA VASTUUSSA TAI HENKILÖSSÄ * (MUKAAN LUKIEN TARKOITUKSET TAI MUUTEN), JOTKA TULEVAT EIVÄT TÄMÄN PALVELUT * TÄMÄN VAHINGON MAHDOLLISUUDESTA. * / # sisältää <stdio.h>
#include <assert.h> // Mukavuustoiminto CUDA: n ajonaikaisen sovellusliittymän tulosten tarkistamiseen // voidaan kääriä minkä tahansa ajonaikaisen API-kutsun ympärille. No-op julkaisussa builds.inlinecudaError_t checkCuda (cudaError_t -tulos) {# jos määritelty (DEBUG) || määritelty (_DEBUG) if (tulos! = cudaSuccess) {fprintf (stderr, "CUDA-ajonaikainen virhe:% s \ n", cudaGetErrorString (tulos)); vakuuttaa (tulos == cudaSuccess); } #endif return result;} void profileCopies (float * h_a, float * h_b, float * d, unsigned int n, char * desc) {printf ("\ n% s siirtoja \ n", desc); allekirjoittamattomat int-tavut = n * koko (kelluva); // tapahtumia ajoitukseen cudaEvent_t startEvent, stopEvent; checkCuda (cudaEventCreate (&startEvent)); checkCuda (cudaEventCreate (&stopEvent)); checkCuda (cudaEventRecord (startEvent, 0)); checkCuda (cudaMemcpy (d, h_a, tavua, cudaMemcpyHostToDevice)); checkCuda (cudaEventRecord (stopEvent, 0)); checkCuda (cudaEventSynchronize (stopEvent)); kelluaika; checkCuda (cudaEventElapsedTime (&time, startEvent, stopEvent)); printf ("Isännän ja laitteen välinen kaistanleveys (GB / s):% f \ n", tavua * 1e-6 / aika); checkCuda (cudaEventRecord (startEvent, 0)); checkCuda (cudaMemcpy (h_b, d, tavua, cudaMemcpyDeviceToHost)); checkCuda (cudaEventRecord (stopEvent, 0)); checkCuda (cudaEventSynchronize (stopEvent)); checkCuda (cudaEventElapsedTime (&time, startEvent, stopEvent)); printf ("Laite-isäntä -kaistanleveys (GB / s):% f \ n", tavua * 1e-6 / aika); for (int i = 0; i < n; ++ i) {if (h_a [i]! = h_b [i]) {printf ("***% s siirrot epäonnistui ***", desc); tauko; }} // siivota tapahtumia checkCuda (cudaEventDestroy (startEvent)); checkCuda (cudaEventDestroy (stopEvent));} int main () {allekirjoittamattomat välit = 990 * 1024 * 1024; const allekirjoittamattomat int-tavut = nElementit * koko (kelluva); // isäntäryhmät kelluvat * h_aPageable, * h_bPageable;
kellua * h_aPinned, * h_bPinned; // laitematriisin kelluva * d_a; // allokoi ja alusta h_aPageable = (float *) malloc (tavua); // isäntähaettava h_bPageable = (float *) malloc (tavua); // isäntähaettava checkCuda (cudaMallocHost ((void **) &h_aPinned, tavut)); // isäntä kiinnitetty checkCuda (cudaMallocHost ((void **) &h_bPinned, tavut)); // isäntä kiinnitetty checkCuda (cudaMalloc ((void **) &d_a, tavut)); // laite (int i = 0; i < nElementit; ++ i) h_aPageable [i] = i; memcpy (h_aPinned, h_aPageable, tavua); muistisarja (h_bPageable, 0, tavua); muistisarja (h_bPinned, 0, tavua); // tulostuslaitteen tiedot ja siirtokoko cudaDeviceProp prop; checkCuda (cudaGetDeviceProperties (&prop, 0)); printf ("\ nLaite:% s \ n", prop.nimi); printf ("Siirtokoko (MB):% d \ n", tavua / (1024 * 1024)); // suorittaa kopioita ja raportoi kaistanleveysprofiiliCopies (h_aPageable, h_bPageable, d_a, nElements, "Pageable"); profileCopies (h_aPinned, h_bPinned, d_a, nElements, "Pinned"); printf ("\ n"); // siivous cudaFree (d_a); cudaFreeHost (h_aPinned); cudaFreeHost (h_bPinned); vapaa (h_aPageable); vapaa (h_bPageable); return 0;}  

Vaihtoehtoisesti bandwidthtest.cu -koodi saadaan seuraavasti: git-klooni https://github.com/parallel- forall / code-sample.git cd code-sample / series / cuda-cpp / optimize-data-siirrot

jotka voidaan kääntää käyttämällä:

  nvcc bandwidthtest.cu -o bandwidthtest  

ja suorita:

  nvprof ./bandwidthtest

Lähtö on esimerkiksi:

  == 20955 == NVPROF profiloi prosessia 20955, komento: ./bandwidthtestDevice: GeForce GTX TITAN XTransfer size (MB): 3960Pageable siirtää isännän laitteelle kaistanleveydelle (GB / s) : 3.073613 Laite-isäntä -kaistanleveys (GB / s): 3.588289 Kiinnitetty siirtää isännän laitteelle -kaistanleveyden (GB / s): 12.004806 Laite-isäntä -kaistanleveys (GB / s): 12.929138
== 20955 == Profiilisovellus: ./bandwidthtest==20955== Profilointitulos: Aika (%) Aikapuhelujen keskim. Vähimmäisnimi 53,45% 1,69626s 2848,13ms 345,81ms 1,35045s [CUDA memcpy HtoD] 46,55% 1,47753s 2 738,76 ms 321,07 ms 1,15646 s [CUDA memcpy DtoH] == 20955 == API-puhelut: Aika (%) Aikapuhelujen keskim. Väh. Enimmäisnimi 46,63% 4,10457 s 2 2,05229 s 1,92812 s 2,17646 s cudaMallocHost 36,07% 3,17518 s 4 793,80 ms 321,13 ms 1.35099s cudaMemcpy 17,21% 1.51471s 2 757.36ms 706.92ms 807.79ms cudaFreeHost 0,03% 2.7035ms 332 8.1430us 150ns 343.79us cuDeviceGetAttribute 0,03% 2.2626ms 1 2.2626ms 2.2626ms 2.2626ms cudaMalloc 0,01% 909.22us 1 909.22us 909.22us 909.22us cudaFree 0,01% 857,27us 1857,27us 857,27us 857,27us cudaGetDevice Properties 0,00% 232,82us 4 58,206us 54,305us 60,715us cuDeviceTotalMem 0,00% 193,19us 4 48,298us 4 5.287us 51.158us cuDeviceGetName 0.00% 115.60us 8 14.450us 2.3390us 28.703us cudaEventRecord 0.00% 71.927us 4 17.981us 3.1920us 61.514us cudaEventSynchronize 0.00% 31.314us 4 7.8280us 709ns 22.528us cudaEventCrea10 0.00 cudaEventDestroy 0.00% 10.234us 4 2.5580us 2.1590us 3.1230us cudaEventElapsedTime 0.00% 2.2380us 2 1.1190us 261ns 1.9770us cuDeviceGetCount 0.00% 1.5190us 8 189ns 141ns 402ns cuDeviceGet  

En kuitenkaan arvioida suurin sallittu kaistanleveys, mutta seuraamaan sen sijaan nykyistä kaistanleveyttä, koska tämä vertailuarvo näkyy:

enter image description here

sama vertailuarvo huomauttaa, että:

Myytti: Grafiikkamuistin kaistanleveyden käyttöä ja PCIe-väylän käyttöä on mahdotonta mitata suoraan.

Siirrettyjen tietojen määrä grafiikkamuisti grafiikkasuorittimeen ja takaosaan on valtava. Siksi näytönohjaimet tarvitsevat niin monimutkaisia ​​muistinohjaimia, jotka pystyvät työntämään tonnia kaistanleveyttä. AMD: n Radeon R9 290X: n kohdalla näet jopa 320 Gt / s. Nvidian GeForce GTX 780 Ti: n luokitus on jopa 336 Gt / s. Suurin PCIe-suoritusteho ei ole yhtä vaikuttava (15,75 Gt / s 16-kaistaisen kolmannen sukupolven linkin kautta), vaikka sitä ei vaadita niin paljon. Mutta kuinka suuri osa siitä hyödynnetään kulloinkin? Onko tämä pullonkaula? Tähän asti on ollut vaikea vastata näihin kysymyksiin. Toivomme kuitenkin, että Kepler-arkkitehtuuri ja NVAPI mahdollistavat niihin kohdistamisen entistä tarkemmin. EVGA GeForce GTX 690

Aloitimme etsinnän katsomalla GeForce GTX 690: n BUS-metriikkaa. Vaikka Nvidia sanoo sen olevan epäluotettava, mietimme silti, mitä voisimme kerätä testituloksistamme. Lukemisen aikana kohtasimme kuitenkin toisen monimutkaisuuden: kortin kahta GK104-näytönohjainta ei ole kytketty suoraan PCIe-pääväylään, vaan ne kytketään pikemminkin PLX PEX 8747: n kautta. Joten riippumatta siitä, mitä emolevyn asetuksia käytetään, GPU: t toimivat PCI Express 3.0 -signaalien nopeudella, paitsi kun ne säästävät virtaa. Siksi GPU-Z näyttää heidän toimivan PCIe 3.0: lla, jopa alustoilla, jotka on rajoitettu PCIe 2.0: een. PEX 8747 -kytkin putoaa edellisen sukupolven nopeuksiin isäntäpuolella.

Kun jokaisen GPU: n väyläohjain toimii PCIe 3.0: lla 16-kaistaisella linkillä, 100%: n käytön tulisi olla 15,75 Gt / s. Pelkästään nämä tiedot eivät auta meitä paljon. On mahdotonta sanoa, kuinka paljon liikennettä ohjataan isäntään ja kuinka paljon toiseen GPU: han. Ja valitettavasti PLX-kytkin ei anna meille pääsyä tarkempaan dataan. Toistaiseksi meillä on pahin skenaario: että kukin GPU vastaanottaa kaiken liikenteen isännältä, eikä kukaan ole monilähetys.

He huomaavat myös seuraavat:

Nvidia paljastaa GeForce-ohjaimensa kautta ohjelmointirajapinnan ("NVAPI"), joka mahdollistaa muun muassa suorituskykymittausten keräämisen. Teknisesti kallistuneille tämä on nvapi.h-otsikkotiedoston asiaankuuluva osa:

FUNCTION NAME: NvAPI_GPU_GetDynamicPstatesInfoEx

DESCRIPTION: Tämä sovellusliittymä hakee määritetyn NV_GPU_DYNAMIC_PSTATES_INFO_EX-rakenteen fyysinen GPU. Jokaisen verkkotunnuksen tiedot indeksoidaan taulukossa. Esimerkiksi:

  • pDynamicPstatesInfo-> hyödyntäminen [NVAPI_GPU_UTILIZATION_DOMAIN_GPU] sisältää GPU-toimialueen tiedot. Tällä hetkellä on neljä verkkotunnusta, joille GPU: n käyttö ja dynaamiset P-tilakynnykset voidaan hakea: graafinen moottori (GPU), kehyspuskuri (FB), videomoottori (VID) ja väyläliitäntä (BUS).

Tämän otsikkokommentin lisäksi sovellusliittymän erityisiä toimintoja ei ole dokumentoitu. Alla olevat tiedot ovat paras tulkintamme sen toiminnasta, vaikka ne perustuvatkin paljon oletuksiin.

  • Grafiikkamoottorin ("GPU") mittarin odotetaan olevan pullonkaula useimmissa peleissä. Jos et näe tätä 100 prosentissa tai lähellä sitä, jokin muu (kuten suorittimen tai muistialijärjestelmän) rajoittaa suorituskykyä.
  • Kehyspuskurin ("FB") metriikka on mielenkiintoinen, jos se toimii kuten tarkoitettu. Nimen perusteella odotat sen mittaavan grafiikkamuistin käyttöä (käytetyn muistin prosenttiosuus). Se ei kuitenkaan ole tämä. Näyttää pikemminkin olevan muistinohjaimen käyttöaste prosentteina. Jos se on oikein, se mittaa ohjaimen käyttämän todellisen kaistanleveyden, jota ei muuten ole saatavana mittauksena millään muulla tavalla.
  • Emme ole yhtä kiinnostuneita videomoottorista ("VID"); sitä ei yleensä käytetä pelaamisessa, ja se rekisteröi tyypillisesti kiinteän 0%: n. Näet, että valitsin liikkuu vain, jos koodaat videota ShadowPlayn kautta tai suoratoistat Shieldiin.
  • Väylärajapinnan ("BUS") mittari viittaa PCIe-ohjaimen käyttöön jälleen prosentteina. Vastaavaa mittausta, jonka voit jäljittää EVGA PrecisionX- ja MSI Afterburner -laitteilla, kutsutaan "GPU-väylän käytöksi".

Pyysimme Nvidiaa valaisemaan NVAPI: n sisäistä toimintaa. Sen vastauksessa vahvistettiin, että FB-metriikka mittaa grafiikkamuistin kaistanleveyden käyttöä, mutta Nvidia hylkäsi BUS-metriikan "pidetyksi epäluotettavaksi eikä sitä siten käytetä sisäisesti".

Kysyimme AMD: ltä sillä oli mikä tahansa sovellusliittymä tai toiminto, joka mahdollisti samanlaiset mittaukset. Sisäisen tarkastuksen jälkeen yrityksen edustajat vahvistivat, etteivät ne tehneet niin. Niin paljon kuin haluaisimme, emme voi suorittaa vastaavia testejä AMD-laitteistolla.

Olen kunnossa, jos PCI Express -väylän käytön mittaus on hieman meluisa.

Microsoft Windowsissa käytän MSI Afterburneria:

enter image description here

üks vastaus:
Leopd
2016-12-30 07:57:46 UTC
view on stackexchange narkive permalink

Uskon, että tämä voidaan saavuttaa Intel Performance Counter Monitor (PCM) -työkaluilla: https://software.intel.com/en-us/articles/intel-performance-counter-monitor. V2.5: sta alkaen se tukee PCIe-valvontaa Xeon E5 -prosessoreilla. ( ref) Näyttää siltä, ​​että myöhemmät julkaisut ovat lisänneet tukea useammalle prosessorityypille: Haswell, Broadwell, Skylake.

Voisitteko lisätä valokuvan tästä ohjelmistosta käytössä?
Intel on lopettanut PCM-tuen. Se on nyt osoitteessa https://github.com/opcm/pcm


Tämä Q & A käännettiin automaattisesti englanniksi.Alkuperäinen sisältö on saatavilla stackexchange-palvelussa, jota kiitämme cc by-sa 3.0-lisenssistä, jolla sitä jaetaan.
Loading...