появление лишних чисел во время сортировки на 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 - количество чисел в массиве (является степенью двойки)
на мой взгляд код написан верно, ошибок быть ну никак не должно, но видимо я что-то упускаю. очень надеюсь на помощь