Я пытаюсь запустить базовое ядро в 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