Использование векторного типа данных OpenCL - PullRequest
0 голосов
/ 21 марта 2019

Я использую драйвер графического процессора, оптимизированный для работы с 16-элементным векторным типом данных. Однако я не уверен, как правильно его использовать.

  • Должен ли я объявить его, например, как cl_float16 на хосте размером в 16 раз меньше исходного массива?
  • Как лучше всего получить доступ к этому типу в ядре OpenCL?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

То, как вы объявляете это на хосте, в значительной степени не имеет значения. Важно то, как вы распределяете его, и даже если только планируете создать буфер с CL_MEM_USE_HOST_PTR и ваш GPU использует системную память. Это потому, что ваша память должна быть правильно выровнена для нулевой копии графического процессора, в противном случае драйвер создаст фоновую копию. Если ваш графический процессор не использует системную память для буферов или вы не используете CL_MEM_USE_HOST_PTR, то это не имеет значения - драйвер выделит надлежащий буфер на графическом процессоре.

Ваша большая проблема в том, что ваш графический процессор должен работать с 16-элементными векторами. Вы должны будете векторизовать каждое ядро, которое хотите запустить на нем. IOW каждая часть наших алгоритмов должна работать с float16 типами. Если вы просто используете простые числа с плавающей точкой или объявляете буфер как global float16* X, но затем используете доступ к элементам (X.s0, Xw и т. Д.) И работаете с ними, производительность будет такой же, как если бы вы объявили буфер global float* X - очень вероятно дерьмо.

0 голосов
/ 22 марта 2019

В коде хоста вы можете использовать cl_float16 тип хоста.Получите доступ к нему как к массиву (например, value.s[5]).Передать в качестве аргумента ядра.В ядре доступ как value.s5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...