Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32

Подгрузка написанной CUDA *.dll в Delphi

23.11.2017, 22:13. Показов 3248. Ответов 34

Студворк — интернет-сервис помощи студентам
Написал библиотеку под cuda на VS10 вот ее код:
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
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
#include "windows.h"
#include "dbgeng.h" 
#include <stdio.h>
#include <conio.h>
#include <cuda_runtime.h>
#include <iostream>
#include <clocale>
 
#include <device_launch_parameters.h>  //   отвечает за нити и блоки
#include <__cudaFatFormat.h>
#include <cuda_runtime_api.h>
 
cudaError_t err1 = cudaSuccess;
 
 __global__ void
Reverse8( BYTE *ptrb,int fileSize_m) //(вх,размер)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
        // Меняем местами соседние биты в парах 
        ptrb[i] = (ptrb[i] & 0x55) << 1 | (ptrb[i]  & 0xAA) >> 1; 
        // Меняем местами пары битов в тетрадах 
        ptrb[i] = (ptrb[i] & 0x33) << 2 | (ptrb[i] & 0xCC) >> 2;
        // Меняем местами тетрады битов в байтах числа 
        ptrb[i] = (ptrb[i] & 0x0F) << 4 | (ptrb[i] & 0xF0) >> 4;
}
 
 extern "C" __declspec(dllexport)
 int StartReverse8(BYTE *ptrb,int fileSize_buffer) // РАБОТАЕТ НА КУДА
{
    BYTE* devBufferGPU = 0;
    cudaError_t  cuerr = cudaMalloc((void**)&devBufferGPU, fileSize_buffer);
  if (cuerr != cudaSuccess)
     {
         fprintf(stderr,"Cannot allocate GPU memory for devBufferGPU :%s\n", cudaGetErrorString(cuerr));
         return 1;
     } 
 
   cuerr=  cudaMemcpy(devBufferGPU,ptrb,  fileSize_buffer, cudaMemcpyHostToDevice);
   if (cuerr != cudaSuccess)
     {
         fprintf(stderr,"Cannot allocate GPU memory for devBufferGPU :%s\n", cudaGetErrorString(cuerr));
         return 1;
     }
    int threadsPerBlock =1024;
    int blocksPerGrid =(fileSize_buffer + threadsPerBlock - 1) / threadsPerBlock;
    Reverse8<<<blocksPerGrid,threadsPerBlock>>>(ptrb, fileSize_buffer);
 
    cudaMemcpy(ptrb,devBufferGPU,  fileSize_buffer, cudaMemcpyDeviceToHost);
    err1 = cudaGetLastError();
    if (err1 != cudaSuccess)
    {
        fprintf(stderr, "Failed to launch vectorAdd kernel (error code %s)!\n", cudaGetErrorString(err1));
        system("pause");
        exit(EXIT_FAILURE);
    } 
    return 0;
}
Хочу подгрузить ее в delphi, что бы можно было пользоваться созданной процедурой. Получился такой код:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, Menus, Spin, Gauges;
 
type
  TForm1 = class(TForm)
    btn2: TButton;
    btn3: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    btn1: TButton;
    //g2: TGauge;
    dlgOpen1: TOpenDialog;
    dlgSave1: TSaveDialog;
    procedure btn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  type
  PPrt = ^ TPrt;
  TPrt = array [0..0] of Byte;
  TInit_Cuda_Reverse = function (Ptr: Byte; T:Integer):Byte; cdecl;
var
  myFile, myFileSave: File ;
  Handle01: HWND; {дескрипторы загружаемых библиотек}
  f:integer;
  Cuda_Reverse:TInit_Cuda_Reverse;
  Prt, Prt1:PPrt;
  Filename, FilenameSave:string;
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.btn2Click(Sender: TObject);
begin
if dlgOpen1.Execute then
  begin
  Filename:=dlgOpen1.FileName;
  Form1.Edit1.Text := Filename;
  end;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
Handle01:= LoadLibrary(PChar('dllexp.dll'));
@Cuda_Reverse:=GetProcAddress(Handle01,'StartReverse8');
end;
 
procedure TForm1.btn1Click(Sender: TObject);
var
f2:integer;
f3:integer;
BytesWrite: DWORD;
FileHandle:THandle;
begin
 f:=1000000;
 GetMem(Prt,f);
 GetMem(Prt1,f);
 f3:=0;
 AssignFile(myFile,Filename);
 FileHandle:= CreateFile(PChar(FilenameSave),
                            GENERIC_WRITE,
                            0,
                            nil,
                            CREATE_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL,
                            0);
 Reset(myFile,1);
 f2:=FileSize(myFile);
 f3:=f2;
   while not Eof(myFile) do
   begin
       BlockRead(myFile,Prt[0],f);
       Cuda_Reverse(Prt[0],f) ;
       WriteFile(FileHandle, Prt[0],f,BytesWrite, nil);
       f2:=f2-f;
       if (f2<f) then f:=f2;
      // Form1.g2.Progress :=   Round((100*((f3-f2)/100))/(f3/100));
   end;
   CloseHandle(FileHandle);
   Application.ProcessMessages;
end;
 
procedure TForm1.btn3Click(Sender: TObject);
begin
 if dlgSave1.Execute then
    begin
    FilenameSave:=dlgSave1.FileName;
    Form1.Edit2.Text:= FilenameSave;
    end;
end;
 
end.
Все, проект запускается (вроде даже длл грузит, так как консольная cudaвская хрень выскакивает ), создается файл нулевого размера и хоть ты тресни. Как быть??

Добавлено через 26 минут
Помогите советом, очень нужно, заранее благодарен)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.11.2017, 22:13
Ответы с готовыми решениями:

Есть исходник DLL на Delphi как (и возможно ли) написать похожее на VB.NET и использовать в среде программы написанной на Delphi
Суть вопроса вкратце такова - Есть исходник DLL написанной на Delphi Library Extdll; uses SysUtils, Windows; type ...

Импорт в Delphi функций из dll, написанной на C++
Здравствуйте! Наверное, многие сталкивались со следующей проблеммой: При попытке в Delphi импортировать функцию из dll, написанной на...

вызов dll написанной на с++
Всем доброго дня!!! Ребята помогите пожалуйста не могу получить результат в Delphi из вызываемой dll написанной на с++/ помогите...

34
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
24.11.2017, 12:56
Цитата Сообщение от Vokintos Посмотреть сообщение
создается файл нулевого размера
Как это связано с библиотекой, если запись в основной программе?
Здесь предпоследний параметр должен быть указателем, и зачем индекс нулевой, если весь массив нужен?
Pascal
1
WriteFile(FileHandle, Prt[0], f, BytesWrite, nil);
Наверное
Pascal
1
WriteFile(FileHandle, Prt, f, @BytesWrite, nil);
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
25.11.2017, 16:38  [ТС]
Если ставишь указатель то он начинается ругаться и выдает:
Types of actual and formal var parameters must be identical
В открытии и сохранении файла все нормально., проверял без cudaвской процедуры. Все сохраняет, ничего не теряется, как только прописываю процедуру из библиотеки, все запускается, создается файл, но в него ничего не отправляется.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
25.11.2017, 17:41
Смотри отладчиком.
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
27.11.2017, 14:58  [ТС]
Запустил с отладчиком на процедуре моей, на первом этапе все показал нормально, запускаю следующий шаг, все значения по нулям.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.11.2017, 15:00
Ты говоришь, что файл нулевого размера. Так WriteFile() выполняется или нет?
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
27.11.2017, 15:25  [ТС]
Да, потому что я убираю процедуру свою, все пишет (на выходе, что и на входе). Вот только что в длл запихнул процедуру реверса, но на процессоре, вставляю вместо cudaвской в делфу, все работает хорошо. А вот с видюхой где то, что то не доотправляет))
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.11.2017, 17:24
Сообщения об ошибках есть? system() убери оттуда.
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
27.11.2017, 19:15  [ТС]
В том то и дело ни ошибок ничего, командная строка открывается, и будто программа работает нормально.

Добавлено через 2 минуты
Закрываешь ее, как предлагает, по концу обработки, и все файл есть, содержания нет. Может проблема в передаче параметров ядру, я ведь поидее запускаю с длл, передачу ядру. А само ядро видимо не запускается.

Добавлено через 3 минуты
Я же экспортирую процедуру передачи параметров ядру (смотреть по коду) а само ядро без экспорта. С такой библиотекой работаю впервые, вот и решил узнать решение проблемы.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.11.2017, 19:23
Ну так ты отладь сначала в обычной программе. Без dll. И никаких командных строк быть не должно.
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
27.11.2017, 19:28  [ТС]
Это процедура нормально на vs10 работает, все без проблем, и реверс делает как надо, ничего не меняю, добавляю только экспорт(ну по правилам создаю длл) и ... ничего
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.11.2017, 19:32
А из программы на C++ вызывается нормально?
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
27.11.2017, 19:51  [ТС]
Там такая же фигня, тип саму процедуру передачи параметров происходит нормально, а само ядро не запускается)
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.11.2017, 20:11
Может, тебе в CUDA-разделе спрашивать надо?
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
27.11.2017, 20:44  [ТС]
сюда запихнули ее, я сам отправлял в тот раздел))
0
Заклинатель змей
 Аватар для DobroAlex
705 / 560 / 219
Регистрация: 30.04.2016
Сообщений: 2,605
27.11.2017, 21:31
Vokintos,
 Комментарий модератора 
перенесено в Delphi по вашей заявке
0
 Аватар для wendstor
139 / 137 / 66
Регистрация: 15.05.2012
Сообщений: 516
28.11.2017, 09:55
C++
1
int StartReverse8(BYTE *ptrb,int fileSize_buffer)
равен
Delphi
1
TInit_Cuda_Reverse = function (Ptr: PByte; T:Integer):Integer; cdecl;
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
28.11.2017, 10:05  [ТС]
Вроде понятно, но ругается на строчку
CUDA_Reverse(Prt[0],f);
Incompatible types:'Byte' and 'PByte'
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.11.2017, 10:33
Я же говорил, что неправильно вызываешь. Убери этот индекс.
0
0 / 0 / 0
Регистрация: 03.05.2016
Сообщений: 32
28.11.2017, 10:36  [ТС]
Уже пробовал и в итоге
Incompatible types:'TPrt' and 'Byte'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.11.2017, 10:36
Помогаю со студенческими работами здесь

Использование DLL написанной на C#
В силу обстоятельств требуется использовать функцию из DLL, написанной на C#. Пишу простенький тест - и не работает. Подскажите,...

Взаимодействие с DLL написанной на CPP
Здравствуй уважажаемый All! Помогите пожайлуста решить такую вот задачу. Есть библиотека написанная на CPP, в ней есть две ф-ции,...

автоматический запуск программы (написанной в delphi)
Всем привет! Может кто-нибудь подскажет. Нужно чтобы автоматически запускалась программа на исполнение, в тот момент, когда в определенный...

Редактирование exe-файла программы, написанной на delphi
Есть бот под один ресурс, на ресурсе сменилось доменное имя и бот теперь не пашет. Бот состоит из одного exe на Borland Delphi 3.0(в...

Права администратора в программе написанной на delphi xe3
Здравствуйте, программисты! Столкнулся с такой проблемой. Добавление собственного манифеста в программу. Раньше, когда добавлял...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru