PyCUDA: запрос статуса устройства (в частности, памяти)

В документации PyCUDA мимоходом упоминаются вызовы интерфейса драйвера, но я немного подумал и могу не вижу, как получить такую ​​информацию, как «SHARED_SIZE_BYTES», из моего кода.

Может ли кто-нибудь указать мне какие-либо примеры запроса устройства таким образом?

Можно ли/как проверить состояние устройства (например, между malloc/memcpy и запуском ядра) для реализации некоторых машинно-динамических операций? (Я хочу иметь возможность иметь дело с устройствами, поддерживающими несколько ядер, «дружественным» способом.


person Bolster    schedule 20.04.2011    source источник
comment
Вы спрашиваете о полях атрибутов, указанных в pycuda.driver.function_attribute? Это не атрибуты устройства, они относятся к скомпилированной функции.   -  person talonmies    schedule 20.04.2011


Ответы (1)


Просто для всех, кто сталкивался с этим, потратив полчаса на CUDA API в одних руках и документация по PyCUDA. в другом творит чудеса. Это намного проще, чем показали мои первоначальные эксперименты.

Информация о ядре во время выполнения

Входящий ленивый ленивый код

...
kernel=mod.get_function("foo")
meminfo(kernel)
...
def meminfo(kernel):
    shared=kernel.shared_size_bytes
    regs=kernel.num_regs
    local=kernel.local_size_bytes
    const=kernel.const_size_bytes
    mbpt=kernel.max_threads_per_block
    print("=MEM=\nLocal:%d,\nShared:%d,\nRegisters:%d,\nConst:%d,\nMax Threads/B:%d" % (local,shared,regs,const,mbpt))

Пример вывода

=MEM=
Local:24,
Shared:64,
Registers:18,
Const:0,
Max Threads/B:512    

Статическая информация об устройстве

Входящий ленивый ленивый код

import pycuda.autoinit
import pycuda.driver as cuda

(free,total)=cuda.mem_get_info()
print("Global memory occupancy:%f%% free"%(free*100/total))

for devicenum in range(cuda.Device.count()):
    device=cuda.Device(devicenum)
    attrs=device.get_attributes()

    #Beyond this point is just pretty printing
    print("\n===Attributes for device %d"%devicenum)
    for (key,value) in attrs.iteritems():
        print("%s:%s"%(str(key),str(value)))

Пример вывода

Global memory occupancy:70.000000% free

===Attributes for device 0
MAX_THREADS_PER_BLOCK:512
MAX_BLOCK_DIM_X:512
MAX_BLOCK_DIM_Y:512
MAX_BLOCK_DIM_Z:64
MAX_GRID_DIM_X:65535
MAX_GRID_DIM_Y:65535
MAX_GRID_DIM_Z:1
MAX_SHARED_MEMORY_PER_BLOCK:16384
TOTAL_CONSTANT_MEMORY:65536
WARP_SIZE:32
MAX_PITCH:2147483647
MAX_REGISTERS_PER_BLOCK:8192
CLOCK_RATE:1500000
TEXTURE_ALIGNMENT:256
GPU_OVERLAP:1
MULTIPROCESSOR_COUNT:14
KERNEL_EXEC_TIMEOUT:1
INTEGRATED:0
CAN_MAP_HOST_MEMORY:1
COMPUTE_MODE:DEFAULT
MAXIMUM_TEXTURE1D_WIDTH:8192
MAXIMUM_TEXTURE2D_WIDTH:65536
MAXIMUM_TEXTURE2D_HEIGHT:32768
MAXIMUM_TEXTURE3D_WIDTH:2048
MAXIMUM_TEXTURE3D_HEIGHT:2048
MAXIMUM_TEXTURE3D_DEPTH:2048
MAXIMUM_TEXTURE2D_ARRAY_WIDTH:8192
MAXIMUM_TEXTURE2D_ARRAY_HEIGHT:8192
MAXIMUM_TEXTURE2D_ARRAY_NUMSLICES:512
SURFACE_ALIGNMENT:256
CONCURRENT_KERNELS:0
ECC_ENABLED:0
PCI_BUS_ID:1
PCI_DEVICE_ID:0
TCC_DRIVER:0
person Bolster    schedule 20.04.2011
comment
Это вывод запроса устройства, но в исходном вопросе вы спрашивали о свойствах кода. Что вас на самом деле интересует? - person talonmies; 20.04.2011