Zoeken…


Invoering

Dit onderwerp belicht verschillende manieren om gegevens ergens te plaatsen waar uw apparaat er toegang toe heeft.

Een array lezen

Om een array van het apparaat terug naar de host te lezen, belt men

clEnqueueReadBuffer($queue, $memobj, $blocking, $offset, $size, $target, 0, null, null);

De $ wachtrij is de CommandQueue die werd gebruikt om het geheugen op het apparaat toe te wijzen. De $ memobj bevat het adres naar het apparaatgeheugen, $ offset en $ grootte bepalen verder waar en hoeveel gegevens worden gekopieerd. Het doel $ is een pointer naar het hostgeheugen waar de gegevens worden opgeslagen. Het doel $ moet worden toegewezen en de juiste grootte hebben.

Een textuur lezen

Een afbeelding lezen is bijna hetzelfde als een matrix lezen. Het enige verschil is dat de grootte en offset driedimensionaal moeten zijn.

clEnqueueReadImage($queue, $memobj, $blocking, $offset, $size, $stride, $slice_pitch, $target, 0, null, null);

De stride $ definieert hoeveel bytes een rij heeft. Normaal is dit slechts breedte * (bytes per pixel), maar iemand wil dat misschien veranderen om de gegevens op de geheugenbanken uit te lijnen. Hetzelfde geldt voor $ slice_pitch, alleen dat deze waarde voor de derde dimensie is.

Een 2D-textuur schrijven

Om een textuur naar het apparaat te kopiëren, zijn er twee stappen nodig

  1. Wijs het geheugen toe aan het apparaat
  2. Kopieer de afbeelding naar het apparaat
  _mem = clCreateImage2D($context, $mem_flags, $image_format, $width, $height, $stride, $source, &err);

De $ mem_flags definiëren hoe het geheugen wordt toegewezen. Het kan alleen-lezen, alleen-schrijven of beide zijn. Bovendien kunt u bepalen waar en hoe het geheugen wordt toegewezen. $ width, $ height en $ stride zijn vrij duidelijk.

Als je mem_flags de gegevens kopiëren, ben je klaar. Als u dat later handmatig wilt doen, moet u een andere functie aanroepen wanneer u klaar bent.

err = clEnqueueWriteImage($queue, _mem, $blocking, $offset, $size, $stride, $slice_pitch, $source, 0, null, null);

De $ offset en $ grootte definiëren het afbeeldingsgebied dat u naar het doelgeheugen wilt kopiëren. De stride $ definieert hoeveel bytes een rij heeft. Normaal is dit slechts breedte * (bytes per pixel), maar iemand wil dat misschien veranderen om de gegevens op de geheugenbanken uit te lijnen. Hetzelfde geldt voor $ slice_pitch, alleen dat deze waarde voor de derde dimensie is. Zowel $ stride als $ slice_pitch moeten overeenkomen met uw invoergegevens.

Geheugenvlaggen

Bij het toewijzen van geheugen heeft u de mogelijkheid om tussen verschillende modi te kiezen:

  • Alleen lezen geheugen
  • Schrijf alleen geheugen
  • Lees- / schrijfgeheugen

Alleen-lezen geheugen wordt toegewezen in het __constant geheugengebied, terwijl de andere twee worden toegewezen in het normale __global gebied.

Naast de toegankelijkheid kunt u bepalen waar uw geheugen wordt toegewezen.

  • Niet opgegeven: uw geheugen wordt toegewezen aan het apparaatgeheugen zoals u zou verwachten. De $ source pointer kan worden ingesteld op nul.
  • CL_MEM_USE_HOST_PTR: Dit vertelt het apparaat dat de gegevens zich in het systeem-RAM bevinden en niet moeten worden verplaatst. In plaats daarvan worden de gegevens rechtstreeks in de ram gemanipuleerd.
  • CL_MEM_COPY_HOST_PTR: Vertelt het apparaat om alle waarden op het opgegeven adres naar het apparaatgeheugen te kopiëren of, met behulp van CL_MEM_ALLOC_HOST_PTR, naar een afzonderlijk geheugengebied in de systeemram.
  • CL_MEM_ALLOC_HOST_PTR: Vertelt het apparaat om ruimte toe te wijzen aan de systeemram. Indien gebruikt als de enige parameter, kan de $ source pointer worden ingesteld op null.

Qua snelheid is de toegang tot het wereldwijde geheugen van het apparaat het snelst. Maar je moet het ook twee keer noemen om gegevens te kopiëren. Het gebruik van de Host-pointer is de langzaamste, terwijl Alloc_host_ptr een hogere snelheid biedt.

Bij gebruik van use_host_ptr doet het apparaat precies dat: het gebruikt uw gegevens in de systeem-ram, die natuurlijk door het besturingssysteem wordt opgeroepen. Dus elke geheugenoproep moet door de cpu gaan om mogelijke paginafouten te verwerken. Wanneer de gegevens beschikbaar zijn, kopieert de cpu deze naar het vastgezette geheugen en geeft deze door aan de DMA-controller met behulp van kostbare cpu-klokcycli. Integendeel, alloc_host_ptr wijst vastgemaakt geheugen in de systeemram toe. Dit geheugen wordt buiten het paginapapmechanisme geplaatst en heeft daarom een gegarandeerde beschikbaarheid. Daarom kan het apparaat de cpu volledig overslaan bij toegang tot de systeemram en DMA gebruiken om snel gegevens naar het apparaat te kopiëren.

Een array schrijven

Het schrijven van een array bestaat uit twee stappen:

  1. Het geheugen toewijzen
  2. Gegevens kopiëren

Om het geheugen toe te wijzen, een eenvoudige oproep naar

_mem = clCreateBuffer($queue, $mem_flags, $size, $host_ptr, &err);

is genoeg. Als je hebt besloten om de host-aanwijzer via de mem_flags te kopiëren, ben je klaar. Anders kunt u de gegevens kopiëren wanneer u maar wilt met

err = clEnqueueWriteBuffer($queue, _mem, $blocking, $offset, $size, $source, 0, null, null);


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow