2017-01-01 3 views
0

Dies ist der Code zum Konvertieren eines Farbbildes in Graustufen. Ich arbeite an dieser Aufgabe für einen Kurs und habe diese Ergebnisse nach completing it.Kann das Verhalten des CUDA-Kernel-Starts nicht verstehen

A. 
blockSize = (1, 1, 1) 
gridSize = (1, 1, 1) 
Your code ran in: 34.772705 msecs. 

B. 
blockSize = (numCols, 1, 1) 
gridSize = (numRows, 1, 1) 
Your code ran in: 1821.326416 msecs. 

C. 
blockSize = (numRows, 1, 1) 
gridSize = (numCols, 1, 1) 
Your code ran in: 1695.917480 msecs. 

D. 
blockSize = (1024, 1, 1) 
gridSize = (170, 1, 1) [the image size is : r=313, c=557, blockSize*gridSize ~= r*c] 
Your code ran in: 1709.109863 msecs. 

Ich habe noch ein paar Kombinationen ausprobiert, aber keine bekam eine bessere Leistung als A. ich in der Nähe auf die Erhöhung der Blockgröße und Gridsize durch kleine Werte mit nur wenigen ns Unterschied bekam. Ex:

blockSize = (10, 1, 1) 
gridSize = (10, 1, 1) 
Your code ran in: 34.835167 msecs. 

Ich verstehe nicht, warum höhere Zahlen nicht bekommen, eine bessere Leistung und stattdessen zu schlechter Leistung führen. Es scheint auch, dass eine zunehmende Blockgröße besser ist als eine Gittergröße.

Antwort

1

Sie berechnen alle Pixel in jedem von Ihnen gestarteten Thread, d. H. Der Kernel ist vollständig seriell. Wenn Sie mehr Blöcke oder größere Blöcke verwenden, wiederholen Sie einfach die Berechnungen. Im letzteren Fall, warum sollte man die for-Schleife nicht aus dem Kernel entfernen und jeden Thread ein Pixel berechnen lassen?

Verwandte Themen