Quants fils poden executar una CPU de 4 fonaments?

Diguem que tinc una CPU de 4core, i que vull executar algun procés en la quantitat mínima de temps. El procés és idealment paral·lelable, de manera que puc executar trossos d'ella en un nombre infinit de fils i cada fil pren la mateixa quantitat de temps.

Com que tinc 4 nuclis, no espero cap velocitat executant més fils que els nuclis, ja que un únic nucli és capaç d'executar un sol fil en un moment donat. No sé molt sobre hardware, així que això només és una suposició.

Hi ha cap benefici per executar un procés paral·lelable en més fils que els nuclis? En altres paraules, el meu procés acabarà més ràpid, més lent, o en la mateixa quantitat de temps si ho faig usant 400 fils en comptes de 4 fils?

13 respostes 13

Si els teus fils no fan I/O, sincronització, etc., i no hi ha res més en execució, 1 fil per nucli tindrà el millor rendiment. No obstant això, això és molt probable que no sigui el cas. Afegir més fils normalment ajuda, però després d'un punt, causen una mica de degradació de rendiment.

No fa gaire, estava fent proves de rendiment en una màquina de 2 Quad-core executant una aplicació ASP.NET al Mono sota una càrrega bastant decent. Hem jugat amb el nombre mínim i màxim de fils i al final ho hem descobert per aquesta aplicació en particular en aquesta configuració la millor a través de rendiment era en algun lloc entre 36 i 40 fils. Qualsevol cosa fora d'aquests límits va fer pitjor. He après la lliçó? Si fos tu, ho provaria amb diferents fils fins que trobeu el número adequat per a la vostra aplicació.

Una cosa segur: els fils 4k trigaran més. Això són molts interruptors de context.

Sé que aquesta pregunta és bastant antiga, però les coses han evolucionat des del 2009.

Hi ha dues coses a tenir en compte ara: el nombre de nuclis, i el nombre de fils que poden executar-se dins de cada nucli.

Amb processadors Intel, el nombre de fils està definit per l' Hyperthreading que és només 2 (quan està disponible). Però tallar el temps d'execució per dos, fins i tot quan no usant dos fils! (i.e. 1 canonada compartida entre dos processos -- això és bo quan tens més processos, no tan bé d'altra manera. Més nuclis són millors definitivament!) Noteu que normalment les CPU modernes tenen més canonades per dividir la càrrega de treball, així que ja no està dividida per dos. Però en Hyperthreading encara comparteix un munt de les unitats de CPU entre els dos fils (alguns anomenen aquestes CPU lògica ).

En altres processadors podeu tenir 2, 4, o fins i tot 8 fils. Si teniu 8 nuclis cadascun dels quals permeten 8 fils, podríeu tenir 64 processos executant- se en paral·lel sense canviar de context.

"Sense canvi de context" òbviament no és cert si executeu amb un sistema operatiu estàndard que canviarà de context per a tota mena d'altres coses fora del vostre control. Però aquesta és la idea principal. Alguns SOs us permeten assignar processadors de manera que només la vostra aplicació té accés/usage de dit processador!

Per la meva pròpia experiència, si teniu molts E/O, múltiples fils són bons. Si teniu un treball intens de memòria (llegir la font 1, llegir la font 2, càlcul ràpid, escriure), aleshores tenir més fils no ajuda. De nou, això depèn de quantes dades llegiu/ escriptura simultàniament (ead;. Si useu SSE 4. 2 i llegiu 256 bits, que s' aturin tots els fils en el seu pas... en altres paraules, probablement un fil és molt més fàcil d' implementar i probablement gairebé tan ràpid si no és més ràpid. Això dependrà de l' arquitectura del procés i de memòria, alguns servidors avançats gestiona els intervals de memòria separats per a nuclis separats de manera que els fils separats seran més ràpids assumint que les vostres dades estan correctament arxivats... per això, en algunes arquitectura, 4 processos s' executaran més ràpid que 1 procés amb 4 fils).

La resposta depèn de la complexitat dels algoritmes emprats en el programa. Em vaig trobar amb un mètode per calcular el nombre òptim de fils fent dues mesures de processament per Tn i Tm per dos números arbitraris de fils Ytxon i CCD). Per a algorismes lineals, el nombre òptim de fils serà N = sq (m) n (Tm *(n- 1) 2880 Tn *(m- 1)) /(n Tn- m Tm).

L'actuació actual dependrà de la quantitat d'entrega voluntària que farà cada fil. Per exemple, si els fils no fan NO I/O i no usen cap servei del sistema (p. e. Estan arribant al 100% i un fil per nucli és òptim. Si els fils fan qualsevol cosa que calgui esperar, llavors haureu d'experimentar per a determinar el nombre òptim de fils. 4.000 fils incuren una planificació significativa, per tant probablement tampoc sigui òptima.

Escalat dèbil: El temps de solució varia amb el nombre de processadors per a una mida de problema fix per processador.

Escalat fort: El temps de solució varia amb el nombre de processadors per a una mida de problema fix.

Si la pregunta és un escalat dèbil, aleshores la resposta de @Gonzalo és suficient. No obstant això, si la pregunta és suposar un escalat fort, hi ha alguna cosa més a afegir. En un escalat fort, assumeixeu una mida de càrrega fixa de manera que si augmenteu el nombre de fils, la mida de les dades que cada fil necessita funcionar en disminuir. A les CPU modernes els accessos a la memòria són cars i seria preferible mantenir la localitat mantenint les dades al cau. Per tant, el nombre més probable òptim de fils es pot trobar quan el conjunt de dades de cada fil s' ajusta a la memòria cau de cada nucli (No vaig als detalls de discutir si és el cau L1/L2/L3) del sistema.

Això conté cert fins i tot quan el nombre de fils excedeix el nombre de nuclis. Per exemple, suposem que hi ha 8 unitats arbitràries (o AU) de treball en el programa que s' executarà en una màquina de quatre nuclis.

Casi 1: Corre amb quatre fils on cada fil necessita completar la 2AU. Cada fil pren 10 per completar ( amb un munt de la memòria cau falla ). Amb quatre nuclis la quantitat total de temps seran 10 (10s * 4 fils / 4 nuclis).

Casi 2: Executa amb vuit fils on cada fil ha de completar 1UA. Cada fil pren només dos (en comptes de 5s per culpa de Manca la quantitat reduïda de la memòria cau ). Amb quatre nuclis la quantitat total de temps seran 4s (2s * 8 fils / 4 nuclis).

He simplificat el problema i les coses ignorades en altres respostes (p. ex., els interruptors de context) però espero que tingueu beneficiosos per tenir més fils que el nombre de nuclis disponibles, depenent de la mida de les dades amb la que esteu tractant.

La resposta és sí i no. Si esteu fent un munt de bloqueig I/O en cada fil, llavors sí, podeu mostrar velocitats significatius fent fins a 3 o 4 fils per nucli lògic.

Si no esteu fent moltes coses de bloqueig, aleshores el més alt amb fil farà que sigui més lent. Així que utilitza un perfilador i mira on estan els embotons en cada peça possiblement paral·lel. Si esteu fent càlculs intensos, llavors més d' un fil per CPU no ajudarà. Si estàs fent una transferència de memòria, tampoc ens ajudarà. Si esteu fent un munt d' E/O, tot i que com per accedir al disc o a Internet, llavors sí, múltiples fils poden ajudar fins a cert punt, o almenys fer que l' aplicació sigui més recepti.

Començaria a aclarir el nombre de fils per a una aplicació, començant a 1, i després arribar a una cosa com 100, executar-cinc proves per a cada nombre de fils, i construir-se una gràfica d'operacions contra el nombre de fils.

Hauríeu de fer que el cas dels quatre fils sigui òptim, amb una lleugera sortida en temps lliure després d'això, però potser no. Pot ser que la vostra aplicació estigui limitada a banda de banda, és a dir, el conjunt de dades que esteu carregant a la memòria és enorme, esteu aconseguint un munt de memòria cau que no funciona, etc., de manera que dos fils són òptims.

Un exemple de molts fils ("thread pool") contra un per nucli és que d' implementar un servidor web a Linux o a Windows.

Com que els sòcols estan col· leccionats a Linux molts fils pot augmentar la probabilitat d' un d' ells enquestant el sòcol adequat en el moment oportú, però el cost del procés global serà molt alt.

En Windows el servidor s' implementaran usant Ports de compleció I/O - IOCPs - que farà que l' esdeveniment sigui conduït per l' aplicació: si un I/O completa el SO llança un fil de suport per processar- lo. Quan el procés ha finalitzat (normalment amb una altra operació I/O com en un parell de sol· licituds) el fil retorna al port IOCP (cuqueu) per esperar a la següent compleció.

Si no s' ha completat I/O no hi ha cap procés per fer i no s' inicia cap fil.

De fet, Microsoft no recomana més d'un fil per nucli en implementacions IOCP. Qualsevol E/O pot estar adjuntada al mecanisme IOCP. També es pot publicar IOCs per l'aplicació, si cal.

Parlant des del càlcul i punt de vista de memòria (Tisic) 4, 000 fils faran que l' aplicació s' executi molt lenta. Part del problema és una gran part del canvi de context i la més probable localitat de la memòria pobre.

Però també depèn de la teva arquitectura. Des d'on vaig sentir els processadors Niàgares se suposa que poden gestionar múltiples fils en un únic nucli utilitzant una mena de tècnica de paral· lelisme avançada. No tinc experiència amb aquests processadors.

Artículos Relacionados:

- Processador -

Esta web usa cookies, puedes ver la política de cookies, aquí -
Política de cookies +