Widziałem obie wersje w tutorialach, ale nie mogłem się dowiedzieć, jakie są ich wady i zalety. Który z nich jest właściwy?Jaka jest różnica między tworzeniem obiektu buforowego a clCreateBuffer + CL_MEM_COPY_HOST_PTR vs. clCreateBuffer + clEnqueueWriteBuffer?
cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY,sizeof(float) * DATA_SIZE, NULL, NULL);
clEnqueueWriteBuffer(command_queue, input, CL_TRUE, 0, sizeof(float) * DATA_SIZE, inputdata, 0, NULL, NULL);
vs.
cl_mem input = clCreateBuffer(context,CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, ,sizeof(float) * DATA_SIZE, inputdata, NULL);
Dzięki.
[Aktualizacja]
I dodaje CL_MEM_COPY_HOST_PTR,
drugiego przykładu, aby poprawne.
Cześć Grizzly, miałeś rację. Zapomniałem CL_MEM_COPY_HOST_PTR. Więc nie ma twardych faktów przemawiających za jednym lub drugim? – Framester
Przynajmniej ze specyfikacji nie powinno być. Oczywiście wydajność może się różnić (ale nie musi), ale to zależałoby od implementacji i może ulec zmianie, więc i tak nie liczę na to (jeśli wydajność ma krytyczne znaczenie dla transferu pamięci, może być interesujące przeanalizowanie asynchronicznych transferów pamięci do (używając CL_FALSE jako parametru blokującego clEnqueueWriteToBuffer) Znowu czy jego szybsza czy nie zależy od implementacji, dla CPU najszybszym powinno być użycie CL_USE_HOST_PTR. Ogólnie rzecz biorąc chciałbym się upewnić, że memtransfertime nie ma większego znaczenia i być donieckim, że – Grizzly
Dzięki, wydajność nie jest taka ważna, to było bardziej akademickie pytanie. – Framester