在OpenCL中,常常會碰到會對向量的多個份量進行交叉運算的狀況,好比性能
float4 d4; //input float scale; //input float2 mix_0 = mix((float2)(d4.wx), (float2)(d4.zy), scale);
這段代碼對d4的wx和zy份量分別作mix運算,顯然,因爲運算對象並非相鄰,存在交叉的狀況,效率可能並不會很好。假如,咱們是對xy和zw作這樣的操做,是否是效率會好一點呢?
對於OCL中須要交換向量中的份量位置的狀況,天然想到shuffle
,而後把代碼該爲:測試
const uint4 ymask = (uint4)(3, 0, 2, 1); float4 d4; //input float scale; //input y4_0 = shuffle(d4, ymask); float2 mix_0 = mix((float2)(d4.xy), (float2)(d4.zw), scale);
通過測試,在個人Snapdragon710上,對個人整個應用,大概能夠提高10%左右的性能ui