Как может появиться код ошибки OpenCL -44 CL_INVALID_PROGRAM, если программа действительна? - PullRequest
0 голосов
/ 05 августа 2020

В некоторых, казалось бы, случайных, но воспроизводимых случаях, program.build(...) возвращает ошибку -44, что означает CL_INVALID_PROGRAM, поэтому program считается недопустимым. Однако program объявлен в строке выше, только в зависимости от context и source. Я проверил, что source является действительным (без ошибок в kernel_code) и context зависит только от device, а device также действителен (проверено на Nvidia Titan Xp и GTX 960M). Как же тогда program может быть недействительным?

Context context = Context(device);
string kernel_code = opencl_code();
Program::Sources source;
source.push_back({ kernel_code.c_str(), kernel_code.length() });
Program program = Program(context, source);
int error = program.build("-cl-fast-relaxed-math -w");

1 Ответ

1 голос
/ 05 августа 2020

Обычно потому, что вы уже привели драйвер в нестабильное состояние ранее в своем приложении. При работе с API-интерфейсами graphi c вам необходимо уделять максимальное внимание проблемам с потоками (включая то, какие API-интерфейсы гарантированно являются потокобезопасными, а какие нет) и потенциальным повреждениям кучи (использовать после освобождения, переполнения буфера), реализации которых легко повреждены.

CL_INVALID_PROGRAM и другие ошибки часто вводят в заблуждение и возникают в явно не связанный момент времени. В частности, они просто указывают на то, что какая-либо внутренняя проверка ошибок не удалась, но редко отображаются значимым образом. полное приложение и без какой-либо многопоточности), то ваша лучшая надежда - зарегистрировать ошибку с помощью NVidia.

Если это невозможно воспроизвести в минимальном примере, то почти наверняка вы вызвали неопределенное поведение где-то еще в своем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...