Obsah fóra hifi.slovanet.sk hifi.slovanet.sk


 
 FAQFAQ   HľadaťHľadať   Zoznam užívateľovZoznam užívateľov   Užívateľské skupinyUžívateľské skupiny   RegistráciaRegistrácia 
 NastaveniaNastavenia   Súkromné správySúkromné správy   PrihláseniePrihlásenie 
http://www.tnt-audio.com/gif/smallstereo_white.gif

Zátěžový test USB

 
Pridať novú tému   Zaslať odpoveď    Obsah fóra hifi.slovanet.sk -> Zdroje signálu
Zobraziť predchádzajúcu tému :: Zobraziť nasledujúcu tému  
Autor Správa
dustin
Hifi inventar


Založený: 06 október 2006
Príspevky: 4397
Bydlisko: Plzeň

PríspevokZaslal: Po január 26, 2009 23:41:24    Predmet: Zátěžový test USB Odpovedať s citátom

O funkci všudypřítomného a často proklínaného USB se toho obecně moc neví. Dlouho mi vrtalo hlavou, tak jsem se mu zkusil maličko podívat na zoubek. Musím se přiznat, že mě USB příjemně překvapilo. Možná to bude někoho zajímat. Předem podotýkám, že jsem se zabýval jen klasickým usb audio verze 1, tedy ne novým USB audio 2.0

Často se tvrdí, že USB zatěžuje CPU, časování provádí software, USB audio je náchylné na stupeň vytížení CPU apod.

Z datasheetu k nejčastějšímu usb řadiči http://download.intel.com/technology/usb/UHCI11D.pdf (obr. 2, 3) je vidět, že USB řadič čte každou 1ms (HW hodiny) datový rámec z fronty dlouhé 1024 rámců.Rámec obsahuje data pro všechny probíhající přenosy, ale isochronní data (tedy audio data) jsou vždy na začátku. Specifikace dokonce tvrdí, že isochronní data smí zabrat až 90% datového prostoru rámce, zbytek je vyhrazen pro přenosy typu bulk a další (např. pro USB disky). Cílem je maximální propustnost USB pro isochronní, tedy časově kritický přenos audia.

Čtení rámců z fronty probíhá nezávisle na CPU, samozřejmě to musí včas připravovat nové rámce. Rámec může obsahovat žádost o přerušení. Jakmile USB řadič na takovou žádost narazí, dokončí zpracování rámce a hodí přerušení. Ovladač USB se tak dozví, který rámec už má řadič zpracovaný.

Přesuňme se od HW implementace USB řadiče k softwaru USB ovladače (součást jádra OS)

Rámce se do seznamu pro řadič dostávají hromadně pomocí tzv. URB (usb request block) bloků. URB obecně nese data pro jeden či více rámců. V posledním rámci URB se nastavuje příznak přerušení (tak je to v linuxu, v ostatních OS asi úplně stejně). Řadič tedy volá přerušení po zpracování jednoho URB.

Teď z druhé strany - aplikační. Zvukový subsystém předává ovladači USB audio vždy určitý objem audiodat. Ovladač data rozseká na URB, pošle je low-level USB ovladači, který spravuje frontu USB řadiče. Ovladač dá včas aplikaci/zvukovému subsystému zpět vědět, že je potřeba dodat další data a aplikace/subsystém dodá data další.

Jsou zde tedy dva typy časových událostí, na které musí CPU reagovat:

1. USB řadič volá přerušení, které musí jádro OS včas obsloužit

2. USB ovladač žádá aplikaci o další data, která musí data včas dodat.

Mimochodem, u PCI karet probíhají obvykle body 1 a 2 současně, USB má ale dvě oddělené vrstvy, protože přes USB řadič může probíhat více komunikačních kanálů současně (usb audio + klávesnice/myš + USB disk atd.)

Je tedy vidět, že USB nepoužívá softwarové časování, jak se často píše (hlavně v diskusích), ale normální HW hodiny v řadiči, generující 1kHz (1ms) pro čtení z fronty a 12MHz pro přenos po sběrnici.

A jak je to se zatížením CPU? Režie USB ovladače není nijak velká, přenáší se víceméně stejný objem dat jako přes PCI, proč by mělo být CPU více zatíženo? Je to o nastavení velikosti URB a velikosti bloku dat předávaných najednou aplikací ovladači. Čím je toto menší, tím je režie (zatížení CPU) vyšší, ale tím je nižší latence řetězce. Pro pouhý poslech ale nízkou latenci vůbec nepotřebujeme (narozdíl od nahrávání/MIDI/masteringu), můžeme si s tím tedy hrát.

V linuxu lze nastavit jako parametr modulu usb-audio počet rámců (paketů) v jednom URB, tedy četnost přerušení. Default je 8 (IRQ každých 8ms, tedy 125IRQ/s). Změnou nrpacks=1 se počet přerušení zvýší na 1000 za sekundu - řadič volá přerušení po každém rámci. Na CPU je to samozřejmě znát.

Na druhou stranu lze po drobné úpravě zdrojáku ovladače teoreticky nrpacks zvednout až na 1000, tedy 1IRQ/s. To již časovače nějak nezvládají, ale na 3 IRQ/s se na mém stařečkovi duronu 1GHz snadno dostanu.

Druhá strana - aplikace vs. ovladač. V linuxové alse lze měnit velikost bufferu na straně ovladače, tedy kolik audiodat předá aplikace ovladači v jednom volání. Čím více, tím nižší zátěž CPU, nižší riziko "nestihnutí včas", ale samozřejmě úměrně tomu vyšší latence. USB ovladač akceptuje až 2,7 sekundy stereo 48kHz audiodat. Pokud spustím takto nastavenou přehrávací aplikaci (aplay) v režimu sledování systémových volání (strace), opravdu jen jednou za cca 3 sekundy volá ovladač. CPU zátěž v podstatě neměřitelná.

Zkusil jsem tedy, jak se linuxové USB audio zachová při vysoké zátěži na duronu 1GHz. Disk jsem plně zatížil low-level čtením celého disku (příkaz dd) a současně jsem spustil kompilaci jádra v 5 vláknech. Oběma příkazům jsem výrazně zvýšil prioritu na -15 (dd) a maximálních -19 (kompilace). Při takové zátěži byl problém vůbec pohnout myší, natož přepnout okno. Zastavení kompilace po dvou minutách jsem musel načasovat přes službu AT, které i tak trvalo zabití prioritizovaných procesů přes 5 minut. Velice nadstandardní zátěž.

Při defaultních parametrech USB řadiče (125IRQ/s) a zvukového subsystému (cca desítky volání ovladače za sekundu) byl zvuk neustále přerušovaný, CPU ani trochu nestíhalo včas plnit frontu USB řadiče audiodaty.

Prodloužení volání aplikace na 2,7s a snížení IRQ na 10 za sekundu (tj. každé URB obsahovalo 100 rámců s 1ms dat) mělo přímo zázračný vliv - pouhé 4 xruny (podtečení fronty) za 5 minut přehrávání při jinak naprosto nepoužitelném PC. A v podstatě je to jasné - obsluha přerušení v jádru má vysokou prioritu (dalších 10 IRQ/s navíc zvládne za každé zátěže) a na aplikaci se i za obrovského vytížení systému jednou za cca 3 sekundy dostane.

Zvýšení priority přehrávací aplikace na úroveň kompilačních procesů (tj. -19) vedlo k naprostému odstranění podtečení fronty, tedy zcela plynulému a kvalitnímu přehrávání.

Byl jsem příjemně překvapen, že se USB díky nezávislosti USB řadiče a jeho jednosekundové hardwarové frontě ukázalo jako velice robustní a že je jen otázkou vhodného nastavení OS, jaký kompromis mezi latencí a robustností se zvolí. Samozřejmě je otázkou, do jaké míry který OS takové nastavení dovolí. I když např. http://www.native-instruments.com/ se chlubí, že jejich USB ovladač pro windows umí údajně volit velikost URB, podobně jako ten v linuxu (ale asi jej nelze donutit k takovým číslům).

Trrochu detailnější popis testů viz http://www.diyaudio.com/forums/showthread.php?postid=1719044#post1719044 a http://www.diyaudio.com/forums/showthread.php?postid=1690264#post1690264

Rád uvítám Vaše připomínky, zkušenosti, opravy, atd.
Návrat hore
Zobrazit informácie o autorovi Odoslať súkromnú správu
opa
Hifi inventar


Založený: 24 február 2007
Príspevky: 10513
Bydlisko: Praha

PríspevokZaslal: Ut január 27, 2009 01:12:38    Predmet: Odpovedať s citátom

Moc do toho nevidím, přesto se zeptám. Znamená to tedy, že zvukovka připojená přes USB, má hodinový kmitočet pro A/D a D/A převodníky závislý pouze a jedině na stabilitě (kvalitě) lokálního generátoru hodinového kmitočtu a nijak nesouvisí s přenosem dat po USB ? Prostě s danou frekvencí zpracovává audiodata a podle stavu bufferu (fronty) občas vydá požadavek na přenos dat ???

Nenarazil jsi někde na zmínku o optickém oddělení USB obvodů (samozřejmě s odděleným napájením) ?
Návrat hore
Zobrazit informácie o autorovi Odoslať súkromnú správu
FILIPAUDIO
Hifista - pokročilec


Založený: 10 február 2007
Príspevky: 395

PríspevokZaslal: Ut január 27, 2009 02:04:20    Predmet: Odpovedať s citátom

OPA
http://www.usb.org/home
Klíčové slovo "wireless usb"
Návrat hore
Zobrazit informácie o autorovi Odoslať súkromnú správu
dustin
Hifi inventar


Založený: 06 október 2006
Príspevky: 4397
Bydlisko: Plzeň

PríspevokZaslal: Ut január 27, 2009 09:19:44    Predmet: Odpovedať s citátom

opa napísal:
Moc do toho nevidím, přesto se zeptám. Znamená to tedy, že zvukovka připojená přes USB, má hodinový kmitočet pro A/D a D/A převodníky závislý pouze a jedině na stabilitě (kvalitě) lokálního generátoru hodinového kmitočtu a nijak nesouvisí s přenosem dat po USB ? Prostě s danou frekvencí zpracovává audiodata a podle stavu bufferu (fronty) občas vydá požadavek na přenos dat ???


Existují tři režimy isochronního přenosu:

Synchronní
------------
Zvukovka nemá vlastní hodiny a do DACu posílá data, jak jí přijdou po sběrnici, tedy každou 1ms nějaký shluk časovaný na 12MHz. Ten shluk asi nějakým časovačem roztáhne na cca 1ms. Prý se tento režim používá v některých levných USB telefonech s nízkou Fs, neviděl jsem.

Adaptivní
-----------
Zvukovka má vlastní hodiny, které se ale průběžně dolaďují přes PLL, aby udržely nějaký mezibuffer průměrně naplněný. Přes USB nejde žádná zpětná vazba. Tento režim je u zvukovek pro přehrávání daleko nejčastější.

Asynchronní
--------------
Zvukovka má vlastní pevné hodiny a naplnění bufferu řídí zpětnými pokyny přes USB ovladači, aby rámce plnil méně/více daty. S tímto režimem jsem se setkal jen u zvukovek E-MU USB a nějakých drahých DACů pro audiofily, v podstatě kusová výroba. Implementace toho režimu je jen o vhodném naprogramování jednočipu v USB přijímači (často je mikroprocesor kompatibilní s 8051, umístěný přímo v čipu USB přijímače). Bohužel téměř nikdo se s tím "nepatlá" a používají firemní firmware v adaptivním režimu.

Takže pro adaptivní režim je klíčové, aby PLL měla co nejméně práce. Tedy data musí přicházet každou 1 ms a pokud možno ve stejném množství. Možná proto se objevují názory, že se při převzorkování 44.1kHz na 48kHz kvalitním algoritmem kvalita zvuku zvyší - v rámci jde pokaždé 48 vzorků, narozdíl od proměnlivého počtu při 44.1kHz. Ta samozřejmě platí jen pro dražší USB zvukovky podporující 44.1kHz nativně, většina umí jen 48kHz a převzorkování provádí transparentně ovladač nějakým krátkým filtrem, aby nenavyšoval latenci.

Obecně je to vždy boj mezi kvalitou/robustností a latencí. Uživatelé spíše potřebují nízkou latenci (MIDI klávesy, souběh video/audio, domácí mastering) a na to bývá řetězec defaultně stavěn.

Chtěl bych zkusit napsat do USB ovladače nějaké sledování pravidelnosti toku dat, ale není to tak úplně triviální, protože každý výpis potřebuje přerušení a mohl by zdržovat USB přenos právě při nastavení maximálního počtu přerušení USB.

opa napísal:
Nenarazil jsi někde na zmínku o optickém oddělení USB obvodů (samozřejmě s odděleným napájením) ?


Na diyaudio.com o optickém oddělení občas mluví, detaily spíše google, např. http://www.maxim-ic.com/appnotes.cfm/an_pk/3891 http://www.baaske.net/schnittstellen_isolation.html?&L=1

Není to tak jednoduché, protože symetrická datová linka USB (vodiče D+, D-) je bidirekcionální (komunikace probíhá v obou směrech).

Možná by bylo zajímavé zkusit izolační trafo ze staré 10Mbps síťovky. I když symetrické páry ethernetu jsou také jen jednostranné (využívají se dva páry).
Návrat hore
Zobrazit informácie o autorovi Odoslať súkromnú správu
Zobraziť príspevky z predchádzajúcich:   
Pridať novú tému   Zaslať odpoveď    Obsah fóra hifi.slovanet.sk -> Zdroje signálu Časy uvádzané v GMT + 1 hodina
Strana 1 z 1

 
Prejdi na:  
Nemôžete pridávať nové témy do tohto fóra.
Nemôžete odpovedať na témy v tomto fóre.
Nemôžete upravovať svoje príspevky v tomto fóre.
Nemôžete mazať svoje príspevky v tomto fóre.
Nemôžete hlasovať v tomto fóre.
Nemôžete pripojiť súbory do tohto fóra.
Nemôžete sťahovať súbory z tohto fóra.


Powered by phpBB © 2001, 2005 phpBB Group
Slovenský preklad phpBB Slovak - www.pcforum.sk
TOPlist