2017-01-09 59 views

回答

0

1)因爲你不能告訴gpu哪些線程寫了哪些元素。常量是由預處理器使用標量引擎準備的,而不是平行的。並行引擎需要N×N次同步才能實現,其中N是參與構建常量緩衝區的線程數。如果你想使用常量內存,在內核中準備一個簡單的(__全局,而不是常量)緩衝區,在下一個內核中使用它作爲常量緩衝區(引擎將其放入常量內存空間中)。但恆定的空間很小,所以矩陣應該很小。這需要2個內核,意味着內核開銷。

2-b)如果緩存性能足夠,只需使用緩衝區即可。所以它可以在單個內核中(第一個線程組準備矩陣,剩餘的使用它計算,直到第一個組使用原子函數給出信號時纔開始)

2-c)如果本地內存大於常量內存,可以使用本地內存併爲每個計算單元自行構建該矩陣,因此它應該採用相同數量的週期(如果使用所有內核,可能會更少),並且可能比常量內存更快。這不需要線程組之間的通信,所以會很快。

2-d)如果矩陣是大,你最需要的帶寬,分發到所有的存儲空間。例如:將矩陣的1/4放到常量內存(5倍帶寬),將矩陣的1/4放到本地內存(10倍帶寬),將全矩陣的1/4放到全局內存(緩存性能的2倍),將剩餘的數據放到指令空間(指令本身),因此多個線程將同時在4個不同的地方工作,使用所有帶寬(常量+本地+緩存+指令緩存)。