windows - vector - > concurrent\_vector migration + OpenGL begrænsning

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg er nødt til at fremskynde nogle beregninger og resultatet af beregningen, så bruges til at tegne OpenGL-model.
Major speed-up arkiveres, når jeg ændrede std :: vector til Concurrency :: samtidige\_vector og bruges parallel\_for i stedet for bare for sløjfer.
Denne vektor (eller samtidige\_vektor) beregnet for (eller parallel\_for) loop og indeholder hjørner for OpenGL til at visualisere.


Det er fint at bruge std :: vektor, fordi OpenGL-gengivelsesproceduren er baseret på, at std :: vector holder det 's elementer i rækkefølge, hvilket ikke er tilfældet med samtidig\_vector. Koden kører noget som dette:


glVertexPointer(3, GL\_FLOAT, 0, &vectorWithVerticesData[0]);


At generere samtidig\_vector og kopiere den til std :: vektor er for dyrt, da der er mange elementer.


Så spørgsmålet er: Jeg vil gerne bruge OpenGL-arrayer, men også gerne bruge samtidige\_vector, som er uforenelig med OpenGL-output.


Nogen forslag?

Bedste reference


Du forsøger at bruge en datastruktur, der ikke gemmer sine elementer sammen i et API, der kræver sammenhængende lagring. Nå skal en af ​​dem give, og det kommer ikke til at være OpenGL. GL er ikke i stand til at gå på concurrent\_vector s datastruktur (ikke hvis du kan lide præstationer).


Så din mulighed er at ikke bruge ikke-sekventielle objekter.


Jeg kan kun gætte på, hvad du gør (da du ikke gav eksempelkode til generatoren), så det begrænser det, jeg kan rådgive. Hvis din parallel\_for gentager for et fast antal gange (med 'fast', mener jeg en værdi, der er kendt umiddelbart før parallel\_for udføres. Det ændrer sig ikke ud fra hvor mange gange du har gentaget ), så kan du bare bruge en regelmæssig vector.


Du skal blot dimensionere vektoren med vector::size. Dette vil værdi-initialisere elementerne, hvilket betyder at hvert element eksisterer. Du kan nu udføre din parallel\_for loop, men i stedet for at bruge push\_back eller hvad som helst, kopierer du blot elementet direkte til dets placering i output. Jeg tror, ​​at parallel\_for kan gentage sig over de faktiske vektor iteratorer, men jeg er ikke positiv. Uanset hvad det betyder noget, du vil ikke få nogen løbsvilkår, medmindre du forsøger at indstille elementet samme fra forskellige tråde.