|
Тема |
Re: ОпенЦълъ [re: |] |
|
Автор |
gat3way (altered mind) |
|
Публикувано | 07.11.10 17:51 |
|
|
Аз знам само при ATI как се случва, вероятно има разлики при NVidia. В общи линии, един wavefront включва до 64 workitem-a, при които една и съща инструкция се изпълнява едновременно за всички workitem-и. Когато има разклонения, има два варианта: в първият вариант, всички workitem-и изпълняват условието и тогава дефакто в рамките на wavefront-а няма branch-ване. Ако обаче само за един workitem, условието не се изпълнява и се налага да се разклонява, тогава branch execution unit-а слага една маска и първо изпълнява wavefront-а за единият случай (според маската, определени stream cores се disable-ват). После изпълнява wavefront-а наново за вторият случай (маската се invert-ва). Един вид, сериализира се цялата работа. Значи имаме ли разклонение, цялото време за изпълнение ще е времето за единия клон+времето за втория клон. При това положение предполагам много зависи колко често workitem-ите diverge-ват в рамките на global worksize-a, ако това става в 50% от случаите, нещата са зле.
EOF
|
| |
|
|
|