бағанның негізгі тәртібіндегі 3D векторының үшбелгілерін қайта реттеу баяу

Мен (x1, y1, z1), (x2, y2, z2), (x3, y3, z3) бірыңғай дәл векторлық үшбөлімдері бар және оларды қайта реттегім келеді. (x1, y1, z1), (x2, y2, z2), (x3, y3, z3) болады (x1, x2, x3,0, y1, y2, y3,0, z1, z2, z3,0)

Мақсат - деректер жиынтығын SSE негізделген есептеу үшін алдын ала дайындау. Мұны істеу үшін келесі коды бар:

for (int i=0;i

Өңдердің соңғы 3 жолы өте баяу, олар менің бүкіл алгоритмімнің 90% пайызын алады!

Бұл қалыпты жағдай емес пе? Осындай араласуға тезірек бара аламын ба? ( сызаттар - статикалық айнымалы және 16 функциясы жиі деп аталады, сондықтан сызаттар блоктары кэштен жойылмауы керек деп ойлаймын.)

7
Бұл үзінді тіпті құрастыра ма? Сіз Vect3F p0 үш рет хабарлайды!
қосылды автор mloskot, көзі
Бұл, негізінен, матрицаны ауыстыру болып табылады. Google Sse транспорты және сіз жылдамырақ нұсқалар аласыз.
қосылды автор Pubby, көзі
Мұнда көптеген уақытша нысандар бар сияқты. Компилятор құрылысшыларды, тапсырмаларды және т.б. тапсырады деп үміттенеміз. Vect3F, Vect4F мүшелерін теңестірілген SSE (__m128) түрімен біріктіру ретінде қарадыңыз ба?
қосылды автор Brett Hale, көзі
Егер компилятор p0, p1, p2 temp объектілерін қолжетімділікті оңтайландырса да, const Vect3F & p0 = нүктелер [i];
қосылды автор Brett Hale, көзі
Өкінішке орай, Vect3F-ді теңестіру мүмкін емес, ол 12 байт болуы керек, сондықтан өзгермелеуді қайта жасаған кезде SSE-ны қолдануға болмайды. Аяқталғаннан кейін деректерді регистрлерге жүктеу үшін _mm_load_ps пайдаланамын (және бұл жылдам). Енді менің барлық конструкторларымды және тапсырмаларды кеңейттім: float * a = (float *) (кэш + i * 3); a [0] = p0.x; a [1] = p1.x; a [2] = p2.x; a [4] = p0.y; a [5] = p1.y; a [6] = p2; a [8] = p0.z; a [9] = p1.z; a [10] = p2.z; Біраз көмектесті, бірақ ол өте баяу.
қосылды автор klapancius, көзі
int tri = triangles [i]; Vect3F p0 = нүкте [indices [tri]]; бастапқы кодының қалай көрінетіні; Vect3F p1 = ұпайлар [indices [tri + 1]]; Vect3F p2 = ұпайлар [индекстері [tri + 2]];
қосылды автор klapancius, көзі

1 жауаптар

Ең алдымен сіз 3 уақытша векторлық нысанды құра алмайсыз. Орнына:

tri = triangles[i];
Vect3F p0 = points[indices[tri]];
Vect3F p1 = points[indices[tri+1]];
Vect3F p2 = points[indices[tri+2]];

Деректерді memcpy() арқылы ғана көшіруіңіз керек; Барлық топтамаңызға арналған цикл жасап, шикізат деректерін көшіріңіз. Бұл - менің ойлағанымның ең жылдам жолы.

3 айнымалы мәнді пайдалану қиындықсыз баяу көптеген конструкторларды іске қосады. Екінші тәсіл (түсініктемеден) бұл дәл сол себептен әлдеқайда жақсы емес.

1
қосылды
Маған сіз қандай құрастырғыштарды және қандай жалаушаларды пайдаланатындығыңызды сұрайды. Менің ойымша, кодты біршама оңтайландырылған күйде көрсету керек.
қосылды автор stefan, көзі