Я новичок в 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;
}
}
}