Передача c struct в функцию с использованием ctypes

Я пытаюсь запросить устройства CUDA, не добавляя зависимость pycuda. Вот что у меня до сих пор:

import ctypes cudart = ctypes.cdll.LoadLibrary('libcudart.so') numDevices = ctypes.c_int() cudart.cudaGetDeviceCount(ctypes.byref(numDevices)) print 'There are', numDevices.value, 'devices.' for x in xrange(numDevices.value): properties = None # XXX What goes here? cudart.cudaGetDeviceProperties(ctypes.byref(properties), x) print properties 

Проблема в том, что я не могу создать пустую структуру для перехода к cudaGetDeviceProperties (). Я хочу сделать что-то вроде этого:

 properties = cudart.cudaDeviceProp 

Но это вызывает эту ошибку:

 AttributeError: /usr/local/cuda/lib64/libcudart.so: undefined symbol: cudaDeviceProp 

Вот соответствующая документация CUDA .

(редактировать)

Благодаря @mhawke, я получил эту работу. Для тех, кто хочет это сделать, я сохраню вам работу по набору самого класса:

 class CudaDeviceProp(ctypes.Structure): _fields_ = [ ('name', ctypes.c_char * 256), ('totalGlobalMem', ctypes.c_size_t), ('sharedMemPerBlock', ctypes.c_size_t), ('regsPerBlock', ctypes.c_int), ('warpSize', ctypes.c_int), ('memPitch', ctypes.c_size_t), ('maxThreadsPerBlock', ctypes.c_int), ('maxThreadsDim', ctypes.c_int * 3), ('maxGridSize', ctypes.c_int * 3), ('clockRate', ctypes.c_int), ('totalConstMem', ctypes.c_size_t), ('major', ctypes.c_int), ('minor', ctypes.c_int), ('textureAlignment', ctypes.c_size_t), ('texturePitchAlignment', ctypes.c_size_t), ('deviceOverlap', ctypes.c_int), ('multiProcessorCount', ctypes.c_int), ('kernelExecTimeoutEnabled', ctypes.c_int), ('integrated', ctypes.c_int), ('canMapHostMemory', ctypes.c_int), ('computeMode', ctypes.c_int), ('maxTexture1D', ctypes.c_int), ('maxTexture1DMipmap', ctypes.c_int), ('maxTexture1DLinear', ctypes.c_int), ('maxTexture2D', ctypes.c_int * 2), ('maxTexture2DMipmap', ctypes.c_int * 2), ('maxTexture2DLinear', ctypes.c_int * 3), ('maxTexture2DGather', ctypes.c_int * 2), ('maxTexture3D', ctypes.c_int * 3), ('maxTexture3DAlt', ctypes.c_int * 3), ('maxTextureCubemap', ctypes.c_int), ('maxTexture1DLayered', ctypes.c_int * 2), ('maxTexture2DLayered', ctypes.c_int * 3), ('maxTextureCubemapLayered', ctypes.c_int * 2), ('maxSurface1D', ctypes.c_int), ('maxSurface2D', ctypes.c_int * 2), ('maxSurface3D', ctypes.c_int * 3), ('maxSurface1DLayered', ctypes.c_int * 2), ('maxSurface2DLayered', ctypes.c_int * 3), ('maxSurfaceCubemap', ctypes.c_int), ('maxSurfaceCubemapLayered', ctypes.c_int * 2), ('surfaceAlignment', ctypes.c_size_t), ('concurrentKernels', ctypes.c_int), ('ECCEnabled', ctypes.c_int), ('pciBusID', ctypes.c_int), ('pciDeviceID', ctypes.c_int), ('pciDomainID', ctypes.c_int), ('tccDriver', ctypes.c_int), ('asyncEngineCount', ctypes.c_int), ('unifiedAddressing', ctypes.c_int), ('memoryClockRate', ctypes.c_int), ('memoryBusWidth', ctypes.c_int), ('l2CacheSize', ctypes.c_int), ('maxThreadsPerMultiProcessor', ctypes.c_int), ('streamPrioritiesSupported', ctypes.c_int), ('globalL1CacheSupported', ctypes.c_int), ('localL1CacheSupported', ctypes.c_int), ('sharedMemPerMultiprocessor', ctypes.c_size_t), ('regsPerMultiprocessor', ctypes.c_int), ('managedMemSupported', ctypes.c_int), ('isMultiGpuBoard', ctypes.c_int), ('multiGpuBoardGroupID', ctypes.c_int), ('singleToDoublePrecisionPerfRatio', ctypes.c_int), ('pageableMemoryAccess', ctypes.c_int), ('concurrentManagedAccess', ctypes.c_int), ] 

One Solution collect form web for “Передача c struct в функцию с использованием ctypes”

Вам нужно определить подкласс ctypes.Structure который задает все поля в структуре cudaDeviceProp . Затем вы можете передать экземпляр структуры функции. Обратите внимание, что вам необходимо заполнить все поля в правильном порядке. Некоторые из них являются массивами, поэтому вам нужно их правильно объявить.

 import ctypes class CudaDeviceProp(ctypes.Structure): _fields_ = [('ECCEnabled', ctypes.c_int), ('asyncEngineCount', ctypes.c_int), ('canMapHostMemory', ctypes.c_int), ('clockRate', ctypes.c_int), ('computeMode', ctypes.c_int), ('concurrentKernels', ctypes.c_int), ... ('totalGlobalMem', ctypes.c_size_t), ('unifiedAddressing', ctypes.c_int), ('warpSize', ctypes.c_int)] properties = CudaDeviceProp() cudart.cudaGetDeviceProperties(ctypes.byref(properties), 0) 
  • Numbapro: нет ускорения для умножения матрицы
  • NumbaPro на устройстве Cuda через соединение ssh
  • Как профилировать код PyCuda с помощью Visual Profiler?
  • Как профилировать код PyCuda в Linux?
  • Что делает ошибка: «Загруженная среда исполнения CuDNN: 5005, но источник был скомпилирован с 5103` означает?
  • PyCuda; nvcc fatal: Файл конфигурации Visual Studio '(null)' не найден
  • Интерпретация «слишком много ресурсов для запуска»
  •  
    Interesting Posts for Van-Lav

    Как использовать потоки в Scrapy / Twisted, т. Е. Как делать асинхронные вызовы блокировки кода в ответных обратных ответах?

    Извлечь время из даты и времени и определить, находится ли время (не дата) в пределах диапазона?

    Ограничение размера файла для read ()?

    Инструмент командной строки AWS Elastic Beanstalk не будет работать на Mac

    Создание отдельного объекта Counter () и Pandas DataFrame для каждого списка в списке списков

    вызывать функцию javascript при очистке веб-страницы

    Как Python 2.7 сравнивает элементы внутри списка

    Использование QThread в PyQT для последовательной связи (w. Pyserial)

    Как удалить все знаки препинания в строке? (Python)

    Как использовать линию продолжения с отступом для визуального отступа?

    Matplotlib.Pyplot не показывает вывод; Нет ошибки

    pip, прокси-аутентификация и «Не поддерживаемая схема прокси»

    marisa trie суффикс сжатия?

    Почему Python не полностью объектно-ориентирован?

    Запись файла .CSV в Python, который работает как для Python 2.7+, так и для Python 3.3+ в Windows

    Python - лучший язык программирования в мире.