конкретное ядро ​​OpenCL работает по-разному на мобильных устройствах и ПК - PullRequest
3 голосов
/ 22 марта 2019

Я пытался запустить ядро ​​OpenCL как на Adreno 630, так и на моем ноутбуке, оказалось, что ядро ​​отлично работает на мобильных устройствах, но каждый раз вылетает мой ноутбук.Я все еще пытаюсь выяснить причину самостоятельно.Вот мое ядро.Я надеюсь, что вы могли бы помочь мне с этим, спасибо.

__kernel void gen_mapxy( __read_only image2d_t _disp, const float offsetX, __write_only image2d_t _mapxy )
{
    const int y = get_global_id(0);

    const int local_y = get_local_id(0);
    __local short temp[24][1080];

    const int imageWidth = get_image_width(_disp);
    for(int x = 0; x < imageWidth; ++x)
        temp[local_y][x] = 0;
    for(int x = imageWidth - 1; x >= 0; --x){
        int tempDisp = read_imagei(_disp, sampler_nearest, (int2)(x, y)).x;
        int newPos = clamp((int)(x + offsetX * (tempDisp) / 255), 0, imageWidth - 1);
        temp[local_y][newPos] = tempDisp;
        write_imagef(_mapxy, (int2)(newPos, y), (float4)(x, y, 0, 0));
}

1 Ответ

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

Вы используете большой локальный массив.

__local short temp[24][1080]

2 байта * 24 * 1080 = 50,6 КБ.Некоторые настольные графические процессоры (и их аналоги для ноутбуков) имеют менее доступные ограничения локальной памяти.Например, GTX 1060 поддерживает значение CL_DEVICE_LOCAL_MEM_SIZE 49152 байта.Но adreno 620 либо игнорирует использование массива, либо поддерживает большие локальные массивы, потому что существует вероятность того, что локальные массивы эмулируются внутри глобальных массивов (ограниченных сотнями мегабайт) для этих чипов.Если они поддерживают быструю локальную память внутри чипа, то появляется больше возможностей для «игнорирования» проблемы, или они действительно удвоили пределы локальной памяти по сравнению с последним поколением Adrenos.

Даже когда GPU поддерживает точное значение, используя всеэто ограничит параллелизм на уровне потоков в каждом конвейере, значительно снизив потенциальный прирост производительности.

Если последнее поколение графических процессоров Adreno одинаковое,

https://compubench.com/device.jsp?benchmark=compu15m&os=Android&api=cs&D=Samsung+Galaxy+S7+%28SM-G930x%29&testgroup=info

на этой странице написано

CL_DEVICE_LOCAL_MEM_SIZE
32768

CL_DEVICE_LOCAL_MEM_TYPE
CL_LOCAL

, это быстро, но это 32 КБ, поэтомуэто игнорирование ошибки, или вы пропустили добавление необходимой логики перехвата ошибок или того и другого.

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