Драйвер графического процессора не отвечает после увеличения NDRangekernel - PullRequest
0 голосов
/ 27 апреля 2018

Я новичок в opencl, и я хочу на самом деле распараллелить этот Sieve Prime, код C ++ здесь: https://www.geeksforgeeks.org/sieve-of-atkin/

Я почему-то не получаю от этого хороших результатов, на самом деле версия процессора намного быстрее после сравнения. Я пытался использовать NDRangekernel, чтобы избежать записи вложенных циклов и, возможно, повысить производительность, но когда я даю более высокое предельное число в функции, драйвер графического процессора перестает отвечать и программа вылетает. Может быть, мой конфиг NDRangekernel не в порядке, кто-нибудь может помочь с этим? Я, вероятно, неправильно получаю NDRange, вот информация о моем GPU.

  • CL_DEVICE_NAME: GeForce GT 740M
  • CL_DEVICE_VENDOR: NVIDIA Corporation
  • CL_DRIVER_VERSION: 397,31
  • CL_DEVICE_TYPE: CL_DEVICE_TYPE_GPU
  • CL_DEVICE_MAX_COMPUTE_UNITS: 2
  • CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS: 3
  • CL_DEVICE_MAX_WORK_ITEM_SIZES: 1024/1024/64
  • CL_DEVICE_MAX_WORK_GROUP_SIZE: 1024
  • CL_DEVICE_MAX_CLOCK_FREQUENCY: 1032 МГц
  • CL_DEVICE_ADDRESS_BITS: 32
  • CL_DEVICE_MAX_MEM_ALLOC_SIZE: 512 МБайт
  • CL_DEVICE_GLOBAL_MEM_SIZE: 2048 МБайт
  • CL_DEVICE_ERROR_CORRECTION_SUPPORT: нет
  • CL_DEVICE_LOCAL_MEM_TYPE: локальный
  • CL_DEVICE_LOCAL_MEM_SIZE: 48 КБайт
  • CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 КБ
  • CL_DEVICE_QUEUE_PROPERTIES:
    -CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
  • CL_DEVICE_QUEUE_PROPERTIES: CL_QUEUE_PROFILING_ENABLE
  • CL_DEVICE_IMAGE_SUPPORT: 1
  • CL_DEVICE_MAX_READ_IMAGE_ARGS: 256
  • CL_DEVICE_MAX_WRITE_IMAGE_ARGS: 16

    вот мой код NDRange

    queue.enqueueNDRangeKernel (add, cl :: NDRange (1,1), cl :: NDRange ((limit * limit) -1, (limit * limit) -1), cl :: NullRange, NULL, & событие) ;

и мой код ядра:

__kernel void sieveofAktin(const int limit, __global bool* sieve)
{
int x = get_global_id(0);
int y = get_global_id(1);
//printf("%d \n", x);

int n = (4 * x * x) + (y * y);
if (n <= limit && (n % 12 == 1 || n % 12 == 5))
    sieve[n] ^= true;

n = (3 * x * x) + (y * y);
if (n <= limit && n % 12 == 7)
    sieve[n] ^= true;


n = (3 * x * x) - (y * y);
if (x > y && n <= limit && n % 12 == 11)
    sieve[n] ^= true;

for (int r = 5; r * r < limit; r++) {
    if (sieve[r]) {
        for (int i = r * r; i < limit; i += r * r)
            sieve[i] = false;
    }
}

}

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Независимо от того, насколько хорош или плох ваш алгоритм или реализация - драйвер всегда должен отвечать. Неполучение ответов вполне возможно ошибка. Подайте отчет об ошибке на http://developer.nvidia.com/.

0 голосов
/ 29 апреля 2018

У вас есть много ветвлений в этом коде, и я подозреваю, что это может снизить производительность на графических процессорах. Обратитесь к главе 6 Руководства по лучшей практике NVIDIA OpenCL , чтобы узнать, почему это снижает производительность.

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

Что касается блокировки, мне нужно увидеть больше кода вашего хоста, чтобы знать, что происходит, но возможно, вы превышаете различные пределы вашей платформы / устройства. Проверяете ли вы ошибки в каждой вызываемой вами функции OpenCL?

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