Я пытаюсь запустить базовое ядро в 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
OpenCl CreateProgramwithSource не работает с C-String, объявленной ни в глобальном, ни в области функции ⇐ C++
Программы на C++. Форум разработчиков
1748807904
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 -линг. Я видел много примеров онлайн -исходного кода ядра, передаваемого таким же образом.
Подробнее здесь: [url]https://stackoverflow.com/questions/79647865/opencl-createprogramwithsource-doesnt-work-with-a-c-string-declared-in-either-g[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия