| 
	
 | 
	
          
            
              
                | Тема | 
                   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
        
        
  
          |  | 
 |    |   
 
 |  
 |   
 |