OpenCl CreateProgramwithSource не работает с C-String, объявленной ни в глобальном, ни в области функцииC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 OpenCl CreateProgramwithSource не работает с C-String, объявленной ни в глобальном, ни в области функции

Сообщение Anonymous »

Я пытаюсь запустить базовое ядро ​​в OpenCl. Смотрите подключенную < /p>
const char kernel_source[] = "__kernel void matmul(__global float* A, __global float* B, __global float* C) { int row = get_global_id(0); int col = get_global_id(1); int N = get_global_size(0); int idx = (row * N) + col; for (int i = 0; i < N; i++) { C[idx] += A[row * N + i] * B[i * N + col]; } }";

void check_error(cl_int err, char step[]);
int check_result(float mat_a[NUM_ROWS][NUM_COLS], float mat_b[NUM_ROWS][NUM_COLS], float mat_c[NUM_ROWS][NUM_COLS]);

int main()
{
// Set up platform, device and context
cl_int CL_err = CL_SUCCESS;

cl_platform_id platform;

CL_err = clGetPlatformIDs(1, &platform, NULL);
check_error(CL_err, "Couldn't find platform");

cl_device_id device;
CL_err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, NULL);
check_error(CL_err, "Couldn't find device");

cl_context context = clCreateContext(NULL, 1, &device, NULL, NULL, &CL_err);
check_error(CL_err, "Couldn't create context");

cl_command_queue command_queue = clCreateCommandQueue(context, device, 0, &CL_err);
check_error(CL_err, "Couldn't create command queue");

cl_program program = clCreateProgramWithSource(context, 1, (const char**)&kernel_source, NULL, &CL_err);
check_error(CL_err, "Couldn't create the program");

< /code>
Как есть, я получаю нарушение доступа к чтению на Clcreateprogramwithsource. Я попытался удалить квалификатор CONST и перенести объявление строки в функциональную область, но в любом случае получил ту же проблему. Строковые литералы гарантированно будут заканчиваться C, но я также пытался явно пройти длину. Позже, в той же программе C, я динамически выделял ту же строку, что и < /p>
int length = strlen(kernel_source);
char* temp = malloc(length + 1);
if (temp == NULL) {
return -1;
}
memcpy(temp, kernel_source, length + 1);
< /code>
Я прошел указатель на динамически распределенную строку, и это также исправило проблему. Обратите внимание, что с оберткой C ++ фактический призыв к ClcreateProgramwithSource имеет те же аргументы, что и мой C -код, но с новой копией строки - поскольку строка преобразуется в строку Std :: Std :: String, а затем обратно в C -линг. Я видел много примеров онлайн -исходного кода ядра, передаваемого таким же образом.

Подробнее здесь: https://stackoverflow.com/questions/796 ... n-either-g
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»