purebasic.info

PureBasic forum
Текущее время: Чт дек 12, 2019 4:21 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: PB + Cuda
СообщениеДобавлено: Чт ноя 21, 2019 9:49 pm 
Не в сети
студент

Зарегистрирован: Вс май 29, 2016 9:42 am
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Всем доброго дня!
Вообщем есть такой код, простейший как 2+2
Код:
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
 
EnableExplicit
 
Import "E:\Program Files\PureBasic\Examples\cuda.lib"
  cuInit(Flags.i)
 cuDeviceGetCount(count.i)
 cuDeviceGet(device.i, ordinal.i)
 cuDeviceGetName(name.s,len.i,dev.i)
 cuDeviceComputeCapability(major.i, minor.i, CudaDevice.i)
 cuDeviceGetAttribute(pi.i,attrib.i,dev.i)
 cuDeviceTotalMem(bytes.i,dev.i)
 cuDeviceTotalMem_v2(bytes.i,dev.i) ;UNDOCUMENTED!!!
EndImport
 
Procedure exit()
PrintN("Press Enter to exit")
Input()
CloseConsole()
End
EndProcedure
 
Procedure detectdevice()  
  ; процедура определение устройств
  Protected CudaDevice.i, namedev.s=Space(128), sizebytes.i, sizebytesundocum.i, piattrib.i, major.i, minor.i, count.i, mp.i, cores.i, i.i
  cuInit(0)
 
  cuDeviceGetCount(@count)
  If count>0
    PrintN("Found "+count+" Cuda device.")
    PrintN("----------------------------")
  Else
    PrintN("No Cuda device found.")
    exit()
  EndIf
 
  For i=0 To count-1
  cores=0
  cuDeviceGet(@CudaDevice, i)                
  cuDeviceGetName(namedev,128,CudaDevice)
  cuDeviceTotalMem(@sizebytes,CudaDevice)
  cuDeviceTotalMem_v2(@sizebytesundocum,CudaDevice)
  cuDeviceComputeCapability(@major,@minor,CudaDevice)
  cuDeviceGetAttribute(@piattrib,16,CudaDevice)
 
  mp=piattrib
  Select major
   
    Case 2
      ;Fermi    
      If minor=1
        cores = mp * 48
      Else
        cores = mp * 32
      EndIf
     
    Case 3
      ; Kepler      
      cores = mp * 192
     
    Case 5
      ; Maxwell      
      cores = mp * 128
     
    Case 6
      ; Pascal      
      cores = mp * 64
     
     Case 7; Pascal
     
      cores = mp * 64  
    Default
      Debug "Unknown device type"
     
  EndSelect
  PrintN("Cuda device["+Str(CudaDevice)+"]:"+namedev+"("+Str(sizebytes/1048576)+"Mb)")
  PrintN("Cuda device["+Str(CudaDevice)+"]:"+namedev+"("+Str(sizebytesundocum/1048576)+"Mb) / undocumented function!!!")
  PrintN("Compute capability: "+Str(major)+"."+Str(minor))
  If cores
     PrintN("Device have:"+cores+" cores")
  Else
     PrintN("Unknown device type")    
  EndIf
  PrintN("----------------------------")
Next i
EndProcedure
 
 
OpenConsole()
detectdevice()
exit()
 


Данный код просто определяет GPU CUDA устройства и пишет информацию о них.
Здесь используется библиотека от нвидия cuda.lib, они есть разные как под х32 так и под х64 ...
Суть вопроса состоит в том, что некоторые процедуры возвращают 32битные значения вместо 64 битных, несмотря на то, что сам PB х64, система х64 и библиотека cuda.lib тоже х64. и все переменные 8 байтные в пурике.
Возьмем к примеру, функцию cuDeviceTotalMem, которая возвращает объем памяти устройства.
У меня карта rtx 2080ti с 11264мб на борту, так вот функция cuDeviceTotalMem возвращает значение 4095мб, а точнее 0xFFFFFFFF вместо 11264мб 0x2C0000000
Т.е. возвращает 32 битное значение вместо 64 битного.
Путем переворачивания всего интернета, я обнаружил недокументированные функции в библиотеке, как-то cuDeviceTotalMem_v2
Так вот, она возвращает правильное 64 битное значение 0x2C0000000
ИзображениеИзображение

Я сколько не пытался доказать нвидиа, что у них баг в библиотеке, они не в какую не хотят это признавать.
Кто-то может подсказать что не так, то ли лыжи не едут, то ли .. Почему процедуры возращают 32 битные значения вместо 64 битных, в то время как недокументированные возвращают как надо 64 битные.
Может я что не так делаю?
Собственно дело даже не в функции возвращающей объем памяти, а в том, что все функции без префикса _v2 возвращают 32 битные значения, это касается и указателей и всего остального, что делает эту библиотеку неприемлемой для карт с памятью свыше 4гб.
И это крайне удручает, так как с ее помощью можно писать много интересного.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PB + Cuda
СообщениеДобавлено: Пт ноя 22, 2019 6:37 am 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 173
Благодарил (а): 113 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
хотелось бы пощупать эти либы. Не могли бы вы поделиться ссылкой?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PB + Cuda
СообщениеДобавлено: Пт ноя 22, 2019 7:18 am 
Не в сети
студент

Зарегистрирован: Вс май 29, 2016 9:42 am
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Так эти либы есть при установке Nvidia toolkit..
Во вложении 10 Cuda x64
Это не все вопросы, которые мне хотелось бы здесь озвучить и обсудить..
Далее, на примере майнера для Ethash алгоритма, хотелось бы узнать почему на вин7 хешрейт как положено, а на вин10 в разы меньше..
ну, и все в том же духе, что касается Cuda.
Но чтобы двигаться дальше, надо выяснить причины возврата 32 битных данных вместо 64 битных.


Вложения:
Комментарий к файлу: v10 x64
cuda.zip [13.95 KiB]
Скачиваний: 24
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PB + Cuda
СообщениеДобавлено: Сб ноя 23, 2019 9:41 pm 
Не в сети
студент

Зарегистрирован: Вс май 29, 2016 9:42 am
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Похоже, что интерес к программированию Cuda не пользуется популярностью :roll:
Жаль, PTX очень интересен для решения многопоточных задач.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PB + Cuda
СообщениеДобавлено: Вт дек 03, 2019 10:19 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 13, 2009 2:41 pm
Сообщений: 371
Благодарил (а): 3 раз.
Поблагодарили: 17 раз.
Пункты репутации: 8
Действительно есть косяк, но не в либе, а в nvcuda.dll, в некоторых функциях есть идентичный код, результат которого приводит к выходу с возвратом 32-х или 64-х битного значения. У меня на видеокарте с 1 Гб памяти возвращает именно 32-х битное значение:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
push rbx
sub rsp,20
mov rbx,rcx
xor eax,eax
test rbx,rbx
mov qword ptr ss:[rsp+30],rax
lea rcx,qword ptr ss:[rsp+30]
mov r8b,1
cmove rcx,rax
call nvcuda.7FFEED4E8AC0
test rbx,rbx
je nvcuda.7FFEED4E8A9F
mov ecx,dword ptr ss:[rsp+30] ; В этой и следующей инструкции происходят операции с 32-битными регистрами,
mov dword ptr ds:[rbx],ecx    ;  хотя данные грузятся из 64-битного участка памяти
add rsp,20
pop rbx
ret


Есть вероятность, что вы что-то упускаете при инициализации библиотеки в представленном вами коде, по этому и результат получаете не тот, которых хотите увидеть.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: PB + Cuda
СообщениеДобавлено: Ср дек 04, 2019 9:28 am 
Не в сети
студент

Зарегистрирован: Вс май 29, 2016 9:42 am
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Fox писал(а):
Есть вероятность, что вы что-то упускаете при инициализации библиотеки в представленном вами коде, по этому и результат получаете не тот, которых хотите увидеть.

Да собственно там-то инициализировать нечего.
Импорт библиотеки как обычно.

Это именно косяк библиотеки. Еще раз повторюсь, что документированные функции возвращают 32битные данные вместо 64 битных. В том время как НЕдокументированные функции в той же программе, отдают 64битные данные. Так что вряд ли тут инициализация имеет значение.
По большому счету, если не использовать в своей программе больше 4гб оперативки ГПУ, то можно и так пользоваться.
Ну, а в целом хотелось бы, конечно, чтобы библиотека работала на 100%.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB