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

04-20 11:51