Разлика между използването на блокиращ запис и event.wait() с неблокиращ запис на OpenCL

Това може да се окаже глупаво, но попаднах на този въпрос и не мога да отговоря сам.

Каква е практическата разлика между използването на следните две части от код при запис в буфер в OpenCL?

  1. Блокиране на запис:
queue->enqueueWriteBuffer(d_vec, CL_TRUE, 0, sizeof(int) * vec.size(), vec.data());
  1. Неблокиращ запис с event.wait():
cl::Event event;
queue->enqueueWriteBuffer(d_vec, CL_FALSE, 0, sizeof(int) * vec.size(), vec.data(), nullptr, &event);
event.wait();

Струва ми се, че и двата кода биха се държали еднакво в крайна сметка. Може ли някой да обясни разликата?

Благодаря ти!


person José Eduardo Bueno    schedule 27.10.2020    source източник


Отговори (1)


Да, те на практика са еднакви, ако това е всичко, което правите. Въпреки това, ако допълнително поставяте в опашка ядра или други неблокиращи операции към едновременна опашка или към други опашки, тогава записът или четенето на буфер може потенциално да се изпълнява паралелно с тези други операции. Можете също да пропуснете изчакването за завършване на събитието за запис, като използвате събитието като вход (зависимост) за последваща поставена задача.

Блокирането на запис е просто пряк път, когато не се нуждаете от тези способности.

person pmdj    schedule 27.10.2020
comment
Благодаря за отговора! Знаете ли дали тези блокиращи и неблокиращи записи могат да се държат различно в Intel и NVidia? Причината да попитам това е, че имам пълна програма с някои OpenCL ядра и получавам различно поведение с NVidia и Intel. Проведох някои тестове и на двете и потвърдих, че ядрата дават едни и същи резултати, което ме накара да си помисля, че може да е нещо с записите. Ако знаете някои препратки, където мога да прочета повече за това, ще бъде наистина полезно. (BTW, когато стартирам моята програма на NVidia, програмата се проваля, а на Intel успява). Благодаря отново - person José Eduardo Bueno; 27.10.2020
comment
@J.E.Chiarelli Е, реализациите на Intel използват унифицирана архитектура на паметта - паметта на устройството и хоста са една и съща физическа памет - така че четенето и записът няма непременно да принудят действително копие - може да се реализира чрез съпоставяне на копиране при запис и т.н. - person pmdj; 27.10.2020
comment
@J.E.Chiarelli, възможно е кодът по някакъв начин да разчита на аспект от тази разлика в детайлите на изпълнението. Сигурни ли сте, че всички поставени в опашка ядра, четения и записи на буфери, достъпи до паметта на хоста и т.н. имат правилно зададени събития на зависимост или използват подходящи серийни опашки? - person pmdj; 27.10.2020
comment
@J.E.Chiarelli, трудно е да се направят конкретни предложения, без да се види кодът - person pmdj; 27.10.2020
comment
вашите отговори са много полезни. Не знаех за тази унифицирана архитектура на паметта и функциите за копиране при запис на Intel. Кодът, върху който работя, е доста голям и не бих искал да ви губя повече времето, но ако сте любопитни, можете да го видите тук и проблемът ми е с това модул. - person José Eduardo Bueno; 27.10.2020
comment
@JoséEduardoBueno Кодът там не е точно линеен, така че няма нищо очевидно нередно, което да ми изскочи. Но ако подозирате проблеми със синхронизирането, бих опитал да изчакам ядрото да завърши след поставяне на опашка в applyStdWells. Също така бих проверил дали опашката, която се използва, е едновременна или последователна. - person pmdj; 27.10.2020
comment
благодаря много отново! Опитах се да изчакам ядрото в applyStdWells да завърши, а също и ядрото, което се изпълнява преди него, но все още нямам успех за NVidia... Но така или иначе ще продължа да ровя - person José Eduardo Bueno; 27.10.2020