появление лишних чисел во время сортировки на opencl

всем привет! передо мной стоит задача реализовать параллельную чет-нечетную сортировку на OpenCL. однако я столкнулся со следующей проблемой: при анализе получившегося отсортированного массива я замечаю, что некоторых чисел из изначального массива просто напросто нет, и вместо них в массив добавляются дубликаты чисел. вот пример:

3669687509
3670134728
3672631890
**3674672863**
**3674672863**
**3674672863**
**3674672863**
**3674672863**
3678491299
3678977840
3682679700

эти дубликаты как раз вставлены вместо тех отсутствующих чисел. еще можно наблюдать такую картину:

3677219755
3678200413
3876358265
3679295333
**4098333720**
3682238860
3682497122
3683629193
**4090764415**
3683961516
**4143845236**
3684067525
3685739983

вот сам код ядра:

const char* kernelSource =
"__kernel void odd_even_sort(__global ulong * arr, const unsigned int n) {\n"
"    unsigned int id = get_global_id(0);\n"
"    for (unsigned int phase = 0; phase < n; phase++) {\n"
"        unsigned int swap_idx;\n"
"        if (phase % 2 == 0) {\n"
"            swap_idx = id * 2;       // Четная фаза\n"
"        }\n"
"        else {\n"
"            swap_idx = id * 2 + 1;    // Нечетная фаза\n"
"        }\n"
"        // Проверка выхода за границы массива\n"
"        if (swap_idx + 1 < n) {\n"
"            // Сравнение и обмен\n"
"            if (arr[swap_idx] > arr[swap_idx + 1]) {\n"
"                ulong temp = arr[swap_idx];\n"
"                arr[swap_idx] = arr[swap_idx + 1];\n"
"                arr[swap_idx + 1] = temp;\n"
"            }\n"
"        }\n"
"        barrier(CLK_GLOBAL_MEM_FENCE);\n"
"    }\n"
"}\n";

вот фрагмент кода запуска ядра:

ret = clSetKernelArg(kernel, 0, sizeof(cl_mem), (cl_ulong*)&A_mem);
ret = clSetKernelArg(kernel, 1, sizeof(unsigned int), &nums);
size_t global_work_size = nums / 2;

ret = clEnqueueNDRangeKernel(command_queue, kernel, 1, NULL,
    &global_work_size,
    NULL,
    0, NULL, NULL);

nums - количество чисел в массиве (является степенью двойки)

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


Ответы (0 шт):