Ошибка сегментации (дамп ядра) в коде хоста с буферами OpenCL - PullRequest
0 голосов
/ 27 мая 2020

Я пытаюсь закодировать хост, который отправляет параметры основной функции. У меня проблема с размером параметров, я определяю эти векторы:

    std::vector<char, aligned_allocator<char>> string(maxstring);
    std::vector<char, aligned_allocator<char>> pattern(maxseq);
    std::vector<int, aligned_allocator<int>> vStringdim(DIM);
    std::vector<int, aligned_allocator<int>> vSeqdim(DIM);
    std::vector<int, aligned_allocator<int>> vOcc(DIM);
    std::vector<int, aligned_allocator<int>> vPi(piDIM * DIM);

С постоянным размером:

#define DIM 50           
#define maxseq 256         
#define maxstring 2048 
#define piDIM 257

Затем я передаю их функции, которая принимает в качестве аргументов

                cl::CommandQueue &q,
                cl::Kernel &kernel,
                std::vector<int, aligned_allocator<int>> &vStringdim,
                std::vector<int, aligned_allocator<int>> &vSeqdim,
                std::vector<char, aligned_allocator<char>> &vString,
                std::vector<char, aligned_allocator<char>> &vSeq,
                std::vector<int, aligned_allocator<int>> &vPi,
                std::vector<int, aligned_allocator<int>> &vOcc)
{

И создает буферы в OpenCL

 OCL_CHECK(err,
              cl::Buffer buffer_stringdim(context,

                                          CL_MEM_USE_HOST_PTR |
                                              CL_MEM_READ_ONLY,
                                          sizeof(int) * DIM,
                                          vStringdim.data(),
                                          &err));
    OCL_CHECK(err,
              cl::Buffer buffer_seqdim(context,

                                       CL_MEM_USE_HOST_PTR |
                                           CL_MEM_READ_ONLY,
                                       sizeof(int) * DIM,
                                       vSeqdim.data(),
                                       &err));

    OCL_CHECK(err,
              cl::Buffer buffer_string(context,

                                       CL_MEM_USE_HOST_PTR |
                                           CL_MEM_READ_ONLY,
                                       sizeof(char) * maxstring,
                                       vString.data(),
                                       &err));

    OCL_CHECK(err,
              cl::Buffer buffer_seq(context,

                                    CL_MEM_USE_HOST_PTR |
                                        CL_MEM_READ_ONLY,
                                    sizeof(char) * maxseq,
                                    vSeq.data(),
                                    &err));
    OCL_CHECK(err,
              cl::Buffer buffer_pi(context,

                                   CL_MEM_USE_HOST_PTR |
                                       CL_MEM_READ_ONLY,
                                   sizeof(int) * piDIM * DIM,
                                   vPi.data(),
                                   &err));

    OCL_CHECK(err,
              cl::Buffer buffer_occ(context,

                                    CL_MEM_USE_HOST_PTR |
                                        CL_MEM_WRITE_ONLY,
                                    sizeof(int) * DIM,
                                    vOcc.data(),
                                    &err));

И я вызываю ядро, которое принимает такие аргументы и выполняет некоторые операции:

void kmp(int *occ, int *stringdim, int *seqdim, char *seq, char *string, int *pi)

С указанными ранее параметрами он работает нормально и фактически возвращает правильный результат без исключений. Но используя эти параметры:

#define DIM 50           
#define maxseq 512         
#define maxstring 4096 
#define piDIM 513

Он возвращает

Segmentation fault (core dumped)

Может ли кто-нибудь помочь мне решить проблему?

...