簡體   English   中英

sse simd中的天花板/地板

[英]ceil/floor in sse simd

任何人都可以提出一個快速的方法來計算float使用預SSE4.1 SIMD樓/小區? 我需要正確處理所有極端情況,例如,當我有一個float值時,該值不能用32位int表示。

目前我使用類似於下面的代碼(我用C內部函數,轉換成ASM存儲清晰度):

;make many copies of the data
movaps       xmm0,   [float_value]
movaps       xmm1,   xmm0
movaps       xmm2,   xmm0

;check if the value is not too large in magnitude
andps        xmm1,   [exp_mask]
pcmpgtd      xmm1,   [max_exp]

;calculate the floor()
cvttps2dq    xmm3,   xmm2
psrld        xmm2,   31
psubd        xmm3,   xmm2
cvtsq2ps     xmm2,   xmm3

;combine the results
andps        xmm0,   xmm1
andnps       xmm1,   xmm2
orps         xmm0,   xmm1

有沒有更有效的方法來檢查float值對於32bit int是否太大?

這是單個元素的一些偽代碼,應該可以直接轉換為矢量指令:

float f;
int i = (int)f; /* 0x80000000 if out of range (as from cvtps2dq) */
if (i == 0x80000000)
    return f;
else
    return (float)i;

您將在第二行中使用舍入模式將演員表轉換為int 您還可以在MXCSR測試IE標志,以檢測超出范圍的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM