Har undersøkt litt rundt dette med interrupts, NRPACKS og bitrater, og på mitt Intel-baserte system med M2Tech HiFace Two gjelder følgende:
- Interrupts per sec er vanligvis ~2000 int/s for USB-busens IRQ, men går av og til ned til 1000 int/s. Det hender av og til at jeg ser verdier i mellom også, men dette er kun i korte øyeblikk så jeg antar at dette egentlig skyldes en overgang fra 1000 til 2000 i løpet av intervallet det måles på slik at gjennomsnittet forskyves.
- NRPACKS påvirker ikke antall interrupts/sec i det hele tatt på mitt system. Siden NRPACKS regulerer antall fulle frames/pakker per URB virker det derfor som om utsending av URB ikke er styrende for generering av en interrupt. Enten det, eller at NRPACKS verdien faktisk enten overstyres per device eller ignoreres.
- Interrupts/sec varierer ikke avhengig av bitrate. Om jeg spiller 24bit/192kHz eller 16bit/44.1kHz spiller ingen rolle. Det er alltid 2000 eller alternativt 1000 av og til.
I den forbindelse åpner det seg noen spørsmål for min del:
- Hvorfor er antall interrupts av og til 1000, men som regel 2000?
Min teori er at siden asynkron USB opererer med to isokrone kanaler, en i hver retning, så blir antallet interrupts også doblet for gjeldende IRQ. Med andre ord at hver isokrone kanal har 1000 int/sec og at den ene kanalen ikke nødvendigvis er aktiv til ethvert tidspunkt under avspillingen.
eller
Systemet mitt består av en dual core CPU med hyper threading. Antallet interrupts dobles fordi det er to fysiske kjerner. Den logiske bristen er imidlertid at linux ser fire logiske CPUer på grunn av hyperthreading. Det må i såfall være noe logikk som skiller på dette for interrupt generering.
- Hvorfor er antall interrupts akkurat 1000/2000?
Her har jeg flere teorier:
I følge dokumentasjonen for isokron USB lages det en pakke hvert ms som igjen kan ha 8 pakker for USB 2.0. Det er derfor naturlig å relatere akkurat 1000 interrupts til kreasjonen av en full frame. Noe som i såfall vil si at det dannes en interrupt bare for fulle pakker og ikke for mikroframes.
eller
Dette styres helt og holdent av enheten selv. Med andre ord vil interruptratene variere med hvilket USB-lydkortet som tilkobles.
I følge dokumentasjonen på MSDN gjelder følgende:
Slik jeg forstår dette er det enheten selv som setter et intervall for sending og mottak av data, og at dette ikke kan styres av driverprogramvaren i det hele tatt.
Spørsmålet er om dette intervallet har noe med interrupts å gjøre i det hele tatt. Det vil si om det å sende data = generasjon av intterupt i den kontekst det snakkes om her.
Noen som har noen innspill?
Hvilke interruptrater observerer dere, og er den avhengig av USB-lydkort, datarate og NRPACKS?
Den enkleste måten jeg har funnet for å observere dette er:
Da får man ut blant annet CPU-bruk, datarater på nettverk og interrupts fordelt på IRQ kalkulert som et gjennomsnitt over et intervall på ett sekund. Installer programmet med "apt-get install procinfo".
- Interrupts per sec er vanligvis ~2000 int/s for USB-busens IRQ, men går av og til ned til 1000 int/s. Det hender av og til at jeg ser verdier i mellom også, men dette er kun i korte øyeblikk så jeg antar at dette egentlig skyldes en overgang fra 1000 til 2000 i løpet av intervallet det måles på slik at gjennomsnittet forskyves.
- NRPACKS påvirker ikke antall interrupts/sec i det hele tatt på mitt system. Siden NRPACKS regulerer antall fulle frames/pakker per URB virker det derfor som om utsending av URB ikke er styrende for generering av en interrupt. Enten det, eller at NRPACKS verdien faktisk enten overstyres per device eller ignoreres.
- Interrupts/sec varierer ikke avhengig av bitrate. Om jeg spiller 24bit/192kHz eller 16bit/44.1kHz spiller ingen rolle. Det er alltid 2000 eller alternativt 1000 av og til.
I den forbindelse åpner det seg noen spørsmål for min del:
- Hvorfor er antall interrupts av og til 1000, men som regel 2000?
Min teori er at siden asynkron USB opererer med to isokrone kanaler, en i hver retning, så blir antallet interrupts også doblet for gjeldende IRQ. Med andre ord at hver isokrone kanal har 1000 int/sec og at den ene kanalen ikke nødvendigvis er aktiv til ethvert tidspunkt under avspillingen.
eller
Systemet mitt består av en dual core CPU med hyper threading. Antallet interrupts dobles fordi det er to fysiske kjerner. Den logiske bristen er imidlertid at linux ser fire logiske CPUer på grunn av hyperthreading. Det må i såfall være noe logikk som skiller på dette for interrupt generering.
- Hvorfor er antall interrupts akkurat 1000/2000?
Her har jeg flere teorier:
I følge dokumentasjonen for isokron USB lages det en pakke hvert ms som igjen kan ha 8 pakker for USB 2.0. Det er derfor naturlig å relatere akkurat 1000 interrupts til kreasjonen av en full frame. Noe som i såfall vil si at det dannes en interrupt bare for fulle pakker og ikke for mikroframes.
eller
Dette styres helt og holdent av enheten selv. Med andre ord vil interruptratene variere med hvilket USB-lydkortet som tilkobles.
I følge dokumentasjonen på MSDN gjelder følgende:
http://msdn.microsoft.com/en-us/library/windows/hardware/hh406225(v=vs.85).aspxHow often does the endpoint send or receive data?
The Interval member is used to determine how often the endpoint can send or receive data. The device sets that value and the client driver cannot changed it. The USB driver stack uses another number to determine the frequency with which it inserts isochronous packets into the data stream: the polling period, which is derived from the Interval value.
Slik jeg forstår dette er det enheten selv som setter et intervall for sending og mottak av data, og at dette ikke kan styres av driverprogramvaren i det hele tatt.
Spørsmålet er om dette intervallet har noe med interrupts å gjøre i det hele tatt. Det vil si om det å sende data = generasjon av intterupt i den kontekst det snakkes om her.
Noen som har noen innspill?
Hvilke interruptrater observerer dere, og er den avhengig av USB-lydkort, datarate og NRPACKS?
Den enkleste måten jeg har funnet for å observere dette er:
Kode:
procinfo -d -n 1
Sist redigert: