我要生成將由多線程生成後,所以我用程序範圍內聲明它讀取的矩陣。它必須是恆定的,所以我剛分配值一度讓OpenCL的不allowes變量的後期initializtion在不斷空間
1)爲什麼OpenCL的要求進行初始化,而只有申報?
2)我該如何解決這個問題?
我要生成將由多線程生成後,所以我用程序範圍內聲明它讀取的矩陣。它必須是恆定的,所以我剛分配值一度讓OpenCL的不allowes變量的後期initializtion在不斷空間
1)爲什麼OpenCL的要求進行初始化,而只有申報?
2)我該如何解決這個問題?
1)因爲你不能告訴gpu哪些線程寫了哪些元素。常量是由預處理器使用標量引擎準備的,而不是平行的。並行引擎需要N×N次同步才能實現,其中N是參與構建常量緩衝區的線程數。如果你想使用常量內存,在內核中準備一個簡單的(__全局,而不是常量)緩衝區,在下一個內核中使用它作爲常量緩衝區(引擎將其放入常量內存空間中)。但恆定的空間很小,所以矩陣應該很小。這需要2個內核,意味着內核開銷。
2-b)如果緩存性能足夠,只需使用緩衝區即可。所以它可以在單個內核中(第一個線程組準備矩陣,剩餘的使用它計算,直到第一個組使用原子函數給出信號時纔開始)
2-c)如果本地內存大於常量內存,可以使用本地內存併爲每個計算單元自行構建該矩陣,因此它應該採用相同數量的週期(如果使用所有內核,可能會更少),並且可能比常量內存更快。這不需要線程組之間的通信,所以會很快。
2-d)如果矩陣是大,你最需要的帶寬,分發到所有的存儲空間。例如:將矩陣的1/4放到常量內存(5倍帶寬),將矩陣的1/4放到本地內存(10倍帶寬),將全矩陣的1/4放到全局內存(緩存性能的2倍),將剩餘的數據放到指令空間(指令本身),因此多個線程將同時在4個不同的地方工作,使用所有帶寬(常量+本地+緩存+指令緩存)。