2012-06-16 32 views
0

我有一種情況,我通過以下方式解決:的OpenCL小於等於和布爾向量

//cube_potentials is float8 
//level_vec is float8 
//shift_vec is int8 and contains (non-overlapping) bit shifts 
int8 shifts = (cube_potentials<=level_vec); 
int flag_index = 0;\n" 
if (shifts.s0) flag_index |= shift_vec.s0; 
if (shifts.s1) flag_index |= shift_vec.s1; 
if (shifts.s2) flag_index |= shift_vec.s2; 
if (shifts.s3) flag_index |= shift_vec.s3; 
if (shifts.s4) flag_index |= shift_vec.s4; 
if (shifts.s5) flag_index |= shift_vec.s5; 
if (shifts.s6) flag_index |= shift_vec.s6; 
if (shifts.s7) flag_index |= shift_vec.s7; 

它的工作原理。問題在於所有這些if-statement都令我感到厭煩,我無法想象它們是世界上最快的東西。我想解決這個問題,像這樣:

//Method 1 
bool8 less = (bool8)(cube_potentials<=level_vec); 
int8 shifts = (int8)(less) * shift_vec; 
int flag_index = shifts.s0 | shifts.s1 | shifts.s2 | shifts.s3 | shifts.s4 | shifts.s5 | shifts.s6 | shifts.s7; 

//Method 2 (more simply) 
int8 shifts = ((int8)(cube_potentials<=level_vec)) * shift_vec; 
int flag_index = shifts.s0 | shifts.s1 | shifts.s2 | shifts.s3 | shifts.s4 | shifts.s5 | shifts.s6 | shifts.s7; 

的問題是,bool8是保留類型,而不是一個真正的人,所以方法1超出。方法2不能正常工作,但。我懷疑原因與第一條線有關。 < =在兩個浮點向量上,我不知道它返回的是什麼,但是大概當它被轉換爲int8時,它並不全是0和1。

我的問題是,如果有什麼辦法以更清潔,更平行的方式重寫原始代碼?

謝謝,

回答

3

試試這個。也許工作:

// gives -1 (0xFFFFFFFF) or 0 for when T or F for each comparison: 
int8 shifts = cube_potentials <= level_vec; 

// leaves only the elements that passed the above compare: 
shift_vec &= shifts; 

// start combining (with all 8 elements): 
shift_vec.lo |= shift_vec.hi; 

// keep going (down to the bottom 4): 
shift_vec.lo.lo |= shift_vec.lo.hi; 

// last one (only considering the bottom two): 
int flag_index = shift_vec.lo.lo.lo |= shift_vec.lo.lo.hi; 
+0

聰明點twiddling。我想你也可以做「 - (cube_potentials <= level_vec」,然後添加一切,但是按位更好!謝謝, – imallett

0

編輯:好了,第二次嘗試:

flag_index = dot(shift_vecs, -islessequal(cube_potentials, level_vec)); 

我想周圍雖然好評。

  • islessequal()應該返回-1或0代表真或假。
  • 我們否定它得到1或者0
  • 然後我們使用點乘積來求和返回true的shift_vecs中的元素。

注:

  • 點()往往是一個硬件指令,所以應該很快。
  • islessequal()可以用<=
  • 只更換工作,如果shift_vec位值是不重疊的(你說他們是)因爲使用的總和。