我有下面的代碼數據的在CUDA內核以後使用重組計劃的一部分:性能推力::計數
thrust::device_ptr<int> dev_ptr = thrust::device_pointer_cast(dev_particle_cell_indices);
int total = 0;
for(int i = 0; i < num_cells; i++) {
particle_offsets[i] = total;
// int num = 0;
int num = thrust::count(dev_ptr, dev_ptr + num_particles, i);
particle_counts[i] = num;
total += num;
}
現在,如果我設置num
爲0(取消對5日線,並註釋掉第6),應用程序運行速度超過30 fps,這是我的目標。但是,當我設置num
等於thrust::count
呼叫時,幀率下降到大約1-2幀/秒。爲什麼會發生?
我的理解是推力應該是一組利用GPU優勢的高度優化的算法,所以我很驚訝它會對我的程序性能產生這樣的影響。這是我第一次使用推力,所以我可能不知道一些重要的細節。
在循環中使用thrust::count
會導致它運行得如此緩慢嗎?我如何優化我的使用情況?
舉一些數字,在我目前的測試情況下,num_particles
是2000左右,而num_cells
約爲1500
你運行的循環,每幀?如果'num_cells'大約是1500,那麼您將啓動大約1500個獨立的內核和1500個主機到設備的內存拷貝(每個拷貝幾乎沒有工作)。如果是這樣的話,你的問題不是推力的表現,而是你的代碼引入的延遲量。 – talonmies 2012-04-15 07:05:03
@talonmies啊,我想知道它是否是CPU-GPU帶寬。如果我傳遞指向設備內存的指針,是不是唯一的主機/設備複製返回的int? – kevintodisco 2012-04-15 07:21:19
是的,結果的轉移是唯一的副本。該循環看起來像是在對粒子進行分箱或編程。應該有更多更有效的方式來使用推力(可能只有一次呼叫)。 – talonmies 2012-04-15 08:13:02