主权项 |
一种应用于GPU中的幂指数运算方法,其特征在于,该方法包括以下步骤:第一步,计算log2cosθ,数学表达式为: <mrow> <msub> <mi>log</mi> <mn>2</mn> </msub> <mi>cos</mi> <mi>θ</mi> <mo>=</mo> <mn>127</mn> <mo>-</mo> <mi>e</mi> <mo>-</mo> <msub> <mi>log</mi> <mn>2</mn> </msub> <mrow> <mo>(</mo> <mn>1</mn> <mo>+</mo> <mi>f</mi> <mo>)</mo> </mrow> <mrow> <mo>(</mo> <mn>0</mn> <mo>≤</mo> <mi>f</mi> <mo><</mo> <mn>1</mn> <mo>)</mo> </mrow> </mrow> <mrow> <mover> <mrow> <mo>=</mo> <mi></mi> </mrow> <mo>~</mo> </mover> <mn>127</mn> <mo>-</mo> <mi>e</mi> <mo>-</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mi>f</mi> <mo>-</mo> <msub> <mi>b</mi> <mi>i</mi> </msub> <mrow> <mo>(</mo> <mi>i</mi> <mo>=</mo> <mn>0,1</mn> <mi>L</mi> <mn>7</mn> <mo>)</mo> </mrow> </mrow> <mrow> <mo>=</mo> <msub> <mi>C</mi> <mi>i</mi> </msub> <mo>-</mo> <mi>e</mi> <mo>-</mo> <msub> <mi>a</mi> <mi>i</mi> </msub> <mi>f</mi> </mrow>Ci表示各个分段区间表达式中的常数项。Ci和ai的定点表示值查表获得;第二步,计算xlog2cosθ,x表示高光系数,θ表示反射光线和观察方向之间的夹角,x是一个32位定点数,高8bit表示整数部分,其余位表示小数部分,计算采用CSA乘法器,得到结果mul_result,如果mul_result大于127,则表示结果溢出,最终cosxθ的结果为0;第三步,计算2mul_result,包括以下步骤:将mul_result在小数点处拆分成整数部分和小数部分,分别记做int_part和fra_part,如式(1)所示:2mul_result=2int_part+fra_part=2int_part‑121+fra_part (1)式(1)中,21+fra_part用分段直线去近似,令frac=1+fra_part,则有 <mrow> <msup> <mn>2</mn> <mrow> <mn>1</mn> <mo>+</mo> <mi>fra</mi> <mo>_</mo> <mi>part</mi> </mrow> </msup> <mo>=</mo> <msup> <mn>2</mn> <mi>frac</mi> </msup> <mover> <mrow> <mo>=</mo> <mi></mi> </mrow> <mo>~</mo> </mover> <msub> <mi>k</mi> <mi>i</mi> </msub> <mi>frac</mi> <mo>+</mo> <msub> <mi>l</mi> <mi>i</mi> </msub> <mo>=</mo> <mn>0,1,2</mn> <mo>.</mo> <mo>.</mo> <mo>.</mo> <mn>7</mn> <mrow> <mo>(</mo> <mn>0</mn> <mo>≤</mo> <mi>frac</mi> <mo><</mo> <mn>1</mn> <mo>)</mo> </mrow> <mo>-</mo> <mo>-</mo> <mo>-</mo> <mrow> <mo>(</mo> <mn>2</mn> <mo>)</mo> </mrow> </mrow>将式(2)的计算结果保留小数点后面的23位,记做exp_fra_result;其中,计算2frac,数学表达式为: <mrow> <msup> <mn>2</mn> <mi>frac</mi> </msup> <mover> <mrow> <mo>=</mo> <mi></mi> </mrow> <mo>~</mo> </mover> <msub> <mi>k</mi> <mi>i</mi> </msub> <mi>frac</mi> <mo>+</mo> <msub> <mi>l</mi> <mi>i</mi> </msub> <mrow> <mo>(</mo> <mi>i</mi> <mo>=</mo> <mn>0,1</mn> <mi>L</mi> <mn>7,0</mn> <mo>≤</mo> <mi>frac</mi> <mo><</mo> <mn>1</mn> <mo>)</mo> </mrow> </mrow> <mrow> <mo>=</mo> <mfenced open='{' close=''> <mtable> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>2</mn> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>5</mn> <mo>+</mo> <mn>8388610</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>0,1</mn> <mo>/</mo> <mn>8</mn> <mo>)</mo> </mtd> </mtr> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>2</mn> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>5</mn> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>7</mn> <mo>+</mo> <mn>8314881</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>1</mn> <mo>/</mo> <mn>8,1</mn> <mo>/</mo> <mn>4</mn> <mo>)</mo> </mtd> </mtr> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>3</mn> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>7</mn> <mo>+</mo> <mn>8151042</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>1</mn> <mo>/</mo> <mn>4,3</mn> <mo>/</mo> <mn>8</mn> <mo>)</mo> </mtd> </mtr> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>4</mn> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>7</mn> <mo>+</mo> <mn>7897089</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>3</mn> <mo>/</mo> <mn>8,1</mn> <mo>/</mo> <mn>2</mn> <mo>)</mo> </mtd> </mtr> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>5</mn> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>7</mn> <mo>+</mo> <mn>7569409</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>1</mn> <mo>/</mo> <mn>2,5</mn> <mo>/</mo> <mn>8</mn> <mo>)</mo> </mtd> </mtr> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>3</mn> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>7</mn> <mo>+</mo> <mn>7077889</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>5</mn> <mo>/</mo> <mn>8,3</mn> <mo>/</mo> <mn>4</mn> <mo>)</mo> </mtd> </mtr> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>2</mn> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>5</mn> <mo>+</mo> <mover> <mi>frac</mi> <mo>‾</mo> </mover> <mo>></mo> <mo>></mo> <mn>7</mn> <mo>+</mo> <mn>6488066</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>3</mn> <mo>/</mo> <mn>4,7</mn> <mo>/</mo> <mn>8</mn> <mo>)</mo> </mtd> </mtr> <mtr> <mtd> <mi>frac</mi> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>2</mn> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>4</mn> <mo>+</mo> <mi>frac</mi> <mo>></mo> <mo>></mo> <mn>7</mn> <mo>+</mo> <mn>5693440</mn> </mtd> <mtd> <mi>frac</mi> <mo>∈</mo> <mo>[</mo> <mn>7</mn> <mo>/</mo> <mn>8,1</mn> <mo>)</mo> </mtd> </mtr> </mtable> </mfenced> <mo>;</mo> </mrow>第四步,得到exp_fra_result之后,用IEEE754单精度浮点数表示cosxθ的近似值。 |