在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%左右的性能