Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenCL
Войти
Регистрация
Восстановить пароль
 
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
1

Opencl на nvidia картах - как ловить ошибки?

04.09.2017, 20:58. Просмотров 456. Ответов 4
Метки нет (Все метки)

Всем известно что opencl программа на nvidia картах ихним сдк компилится без ошибок несмотря на корректность файл ядра kernel.cl. В случае хоть малейшей ошибки просто напросто программа при запуске ядра не будет выводить ничего и считать) А как же понять в каком месте ошибка сделана? Часто это не ошибка а неподдержка какой либо коснтукции в связи с урезкой C99. Ищу ошибки методом тыка, но право уже надоело.

Добавлено через 3 минуты
пс простите за неграмотную детскую лексику, не в умате я сегодня
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2017, 20:58
Ответы с готовыми решениями:

Как на OpenCl работать с изображением?
Ку! Есть вопрос, как можно с помощью OpenCl работать с изображением...

Как обойтись без cl файла в OpenCL?
Здравствуйте! В OpenCL требуются cl файлы, в которых задаются процедуры...

OpenCL Cloo Как передать двумерный массив?
Как передать дувумернный массив в kernel? и как получить индекс каждого...

Как включить openCL в Adobe Photoshop CC 2017 (32 Bit)
Добрый день. Такая проблема - есть установленный Adobe Photoshop CC 2017 (32...

Установка вспомогательной карты от nvidia для поддержки physx на картах amd
Добавлено через 1 минуту PS. Сейчас уже не учусь так что нет возможности...

4
snake32
1653 / 1105 / 194
Регистрация: 26.02.2009
Сообщений: 4,102
Записей в блоге: 5
11.09.2017, 12:45 2
jenokizm, каждая ф-ия OpenCL возвращает статус, для clBuildProgram я проверяю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
procedure _Program.Build( const device:CLDeviceID; options:string = '';
                          notify:TProgramNotify=nil; user_data:Pointer = nil );
  var status:TErrorCode;
      p:PCLchar;
      s:string;
begin
  p := PCLchar( CLstring(options) );
  status := clBuildProgram( @self, 1, @device, p, notify, user_data );
  if status = CL_BUILD_PROGRAM_FAILURE then
  begin
    s := 'CL_BUILD_PROGRAM_FAILURE' + #10 + GetLog( device );
    CLAssert( false, s );
  end else
    CLAssert( status = CL_SUCCESS, 'clBuildProgram ' + EnumToStr(status) );
end;
 
function _Program.GetLog( device:CLDeviceID ):string;
  var sz:size_t;
      s:CLstring;
begin
  BuildInfo( device, CL_PROGRAM_BUILD_LOG, 0, nil, @sz );
  SetLength( s, sz );
  BuildInfo( device, CL_PROGRAM_BUILD_LOG, sz, Pointer(s) );
  while( sz > 0 )and( s[sz] = #0 )do
    dec( sz );
  SetLength( s, sz );
  Result := string( s );
end;
 
procedure _Program.BuildInfo( device:CLDeviceID; param:TProgramBuildInfo; size:size_t; value:Pointer; retsize:psize_t = nil );
  var status:TErrorCode;
begin
  status := clGetProgramBuildInfo( @self, device, param, size, value, retsize );
  CLAssert( status = CL_SUCCESS, 'clGetProgramBuildInfo'#10
                                +'Param: '+ EnumToStr( param )+#10
                                +'Status: '+EnumToStr( status ));
end;
Таким образом при ошибке в коде OpenCL мне вылазит более-менее адекватная подсказка.
Хотя не всегда. На nVidia есть проблемы.
0
Prok12
88 / 14 / 1
Регистрация: 08.11.2011
Сообщений: 91
03.01.2018, 20:17 3
В моём примере в соседней ветке - OpenCL в Delphi XE2 под Win64bit: можете протестировать на своей видеокарте?
ошибки в коде Kernel на C99 выдаются в открывающемся окне. И не важно, компиляция на NVIDIA или на AMD карте. Вот только описание ошибок будет немного разное.
Вот фрагмент кода (целиком доступен по ссылке), где текстовый файл (Kernel на C99) FileOpenCL запускается на компиляцию, и при выявлении видео-драйвером ошибок в нём, они выдаются на отдельную форму минимально-необходимых размеров ErrorForm:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{=====================================================================}
{======= Загрузка одной программы на Context и её компиляция =========}
{=====================================================================}
function TOpenCLForm.LoadProgramToContext(const FileOpenCL: TFileName;
   var OpenCLProg: cl_Program): Boolean;
var PR: array[0..1] of PAnsiChar;   SizePR: array[0..1] of Size_t;
    ErrCode: cl_uint;   ErrS: AnsiString;   MyErr: String;
    Returned_Size: Size_t;
var ErrorForm: TForm;   ErrorBox: TScrollBox;   LW,LH: LongInt;
begin
Result := False;   { Признак успешного завершения, пока False }
   Try
   If not ReadProgramString(FileOpenCL) then
    ExceptCL('ProgramFile ' + FileOpenCL + ' not exists or empty !');
   PR[0] := PAnsiChar(AnsiProgram);
   SizePR[0] := Length(AnsiProgram);
   OpenCLProg := clCreateProgramWithSource(Context, 1,
    @PR[0], @SizePR[0], @ErrCode);
   If ErrCode <> CL_SUCCESS then
    ExceptCL(FileOpenCL + '- Create Program With Source failed!');
{ Build the Program (OpenCL JIT compilation).В случае ошибки в тексте }
{ программы-строки будет выведено сообщение с указанем места ошибки.  }
   ErrCode := clBuildProgram(OpenCLProg, 0, nil, nil, nil, nil);
// ErrCode := clBuildProgram(OpenCLProg, 0, nil, {nil,}
//  PAnsiChar(AnsiString('-cl-std=CL2.0')), nil, nil);
      If ErrCode <> CL_SUCCESS then begin
{ Определеям для начала только длину сообщения об ошибке }
      clGetProgramBuildInfo(OpenCLProg, SelectedDevice,
       CL_PROGRAM_BUILD_LOG, 0, nil, @Returned_Size);
{ Выделяем память на сообщение об ошибке и читаем его }
      SetLength(ErrS, Returned_Size);
      clGetProgramBuildInfo(OpenCLProg, SelectedDevice,
       CL_PROGRAM_BUILD_LOG, Returned_Size, PAnsiChar(ErrS), nil);
      MyErr := String(ErrS);
      MyErr := CRLF + CRLF + Copy(MyErr, 1, Pos(#0,MyErr) - 1);
//.....................................................................
{ Покажем ошибки на отдельной форме: могут не влезть в окно сообщения }
      ErrorForm := TForm.Create(OpenCLForm);
         With ErrorForm do begin
         Caption := FileOpenCL + ' - BuildProgram failed!';
         Position := poScreenCenter;
         Width := MulDiv(Screen.Width, 2, 3);
         Height := MulDiv(Screen.Height, 4, 5);
         BorderStyle := bsDialog;
         ErrorBox := TScrollBox.Create(ErrorForm);
         ErrorBox.Parent := ErrorForm;     ErrorBox.Align := alClient;
         ErrorBox.Color := clBlack;
            With TLabel.Create(ErrorForm) do begin
            Font.Size := 10;   Parent := ErrorBox;   Caption := MyErr;
            LW := Width;   LH := Height;     Font.Color := clAqua;
            end;
{ Уменьшим при возможности размер формы с ошибками }
         LW := Max(0, ClientWidth - 50 - LW);
         LH := Max(0, ClientHeight - 50 - LH);
         Width := Width - LW;    Height := Height - LH;
         ShowModal;
         end;
      ErrorForm.Free;
//.....................................................................
      ExceptCL(FileOpenCL + ' - BuildProgram failed!');
      end;
   Result := True;  { Признак успешного завершения: дошли до конца }
   finally
   Finalize(AnsiProgram);          Finalize(ErrS);
   end;
end;
Если хотите, чтобы Warning тоже выдавались, как ошибки, засылаем программу на компиляцию с другим флагом:
Delphi
1
2
   ErrCode := clBuildProgram(OpenCLProg, 1,
    @SelectedDevice,   PAnsiChar(AnsiString('-Werror')), nil, nil);
Добавлено через 2 часа 30 минут
Забыл по мелочам - добавка к предыдущему коду (перед ним):
Delphi
1
2
3
4
5
6
7
8
9
const CRLF = #13#10;
......
......
{========= Генерация исключения и вывод сообщения об ошибке ==========}
procedure TOpenCLForm.ExceptCL(const ExceptMessage: String);
begin
ShowMessage('Error OpenCL: ' + ExceptMessage);
Raise EAbort.Create('');   { Silent: не выводится на экран }
end;
0
jenokizm
21 / 37 / 14
Регистрация: 27.03.2014
Сообщений: 754
07.01.2018, 00:23  [ТС] 4
Ребят тема как бы в си разделе. Зачем вы пихаете свой делфи?
вот такой код последний раз использовал (подсказал какой то чел)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    try
    {
    hashProg.build();
    }
    catch (cl::Error& e)
    {
    if (e.err() == CL_BUILD_PROGRAM_FAILURE)
    {
    for (cl::Device dev : devices)
    {
    // Check the build status
    cl_build_status status = hashProg.getBuildInfo<CL_PROGRAM_BUILD_STATUS>(dev);
    if (status != CL_BUILD_ERROR) continue;
 
    // Get the build log
    std::string name = dev.getInfo<CL_DEVICE_NAME>();
    std::string buildlog = hashProg.getBuildInfo<CL_PROGRAM_BUILD_LOG>(dev);
    std::cerr << "Build log for " << name << ":" << std::endl << buildlog << std::endl;
    }
    }
    else
    {
    throw e;
    }
    }
0
Prok12
88 / 14 / 1
Регистрация: 08.11.2011
Сообщений: 91
07.01.2018, 03:25 5
Объясняю. OpenCL 1.2 - это и есть C99 для Kernel (последние версии - более новый СИ). Поэтому все темы, связанные с OpenCL, здешние модераторы задвигают в раздел по СИ, независимо от того, на каком языке написан код на хосте (Delphi, Java, C++ и т.д.). Сами вызовы функций OpenCL на хосте на всех языках практически идентичны.
0
07.01.2018, 03:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.01.2018, 03:25

Ловить ошибки вычисления формул через VBScript
Привет, я в своей программе создал калькулятор, код работает, но если в edit...

Как ловить пакеты?
Доброго времени суток! Запускаю на компьютере клиент и сервер, обмен пакетами...

IOExeption как перестать ловить?
Вот решил побаловаться с файлами но не тут то было я стал ловить IOExeption...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru