2015-05-16 4 views
1

Наверное, очень простой вопрос здесь, но я искал его в течение нескольких часов, чтобы ничего не показывать.PyOpenCL: как создать буфер локальной памяти?

У меня есть этот кусок кода, я хотел бы иметь 256-битный (8 uint32) bitstring_gpu как localmemory указатель в устройстве:

def Get_Bitstring_GPU_Buffer(ctx, bitstring): 
    bitstring_gpu = cl.Buffer(ctx, mem_flags.READ_ONLY | mem_flags.COPY_HOST_PTR, hostbuf=bitstring) 
return bitstring_gpu 

Это позже используется на вызов ядра:

prg.get_active_hard_locations_64bit(queue, (HARD_LOCATIONS,), None, memory_addresses_gpu.data, bitstring_gpu, distances_gpu.data, hash_table_gpu.data).wait() 

... и битовое это просто случайные 256-битный битовый (генерируется через SHA256, а затем превращается в Numpy массив.

def Get_Random_Bitstring():  
    bitstring = address_space_through_sha256_SDM.get_bitstring(str(random.randrange(2**32-1))) 
return bitstring 

Как я могу заставить bitstring_buf перейти в быструю локальную память?

Связанный, но другой вопрос; здесь буфер создается внутри ядра ...

How to create variable sized __local memory in pyopencl?

+1

Вы упомянули «bitstring_buf», однако я не вижу упоминания об этом в вашем коде ... – Sebivor

+0

Bitstring - это всего лишь 256-битная случайная битовая строка. Я уточню вопрос. – linhares

+0

Возможный дубликат [Как создать переменную размерную \ _ \ _ локальную память в pyopencl?] (Http://stackoverflow.com/questions/5912968/how-to-create-variable-sized-local-memory-in-pyopencl) –

ответ

1

Возможно, я неправильно понял вопрос, но если вы хотите, чтобы ваш массив размещен в локальной памяти - вы делаете это полностью внутри ядра. Ваш код OpenCL, а не ваш код Python, отвечает за выделение и копирование в локальную память.

Например, этот код OpenCL - внутри ядра - создаст массив из 8 локальных uint и скопирует один uint из глобальной памяти в новый локальный массив.

__local uint my_local_array[8]; 

my_local_array[0] = my_global_array[0]; 

Когда вы хотите, чтобы ваши результаты обратно из локальной памяти, вы копируете от локального до глобального, а затем скопировать из глобальных обратно к хозяину.

Надеюсь, что это поможет!

+0

У меня создалось впечатление, что вы можете передать буфер как __local; так, моя идея неправильная? – linhares

+2

Передача параметра '__local' в ваше ядро ​​требуется только тогда, когда объем локальной памяти неизвестен во время компиляции и, следовательно, распределяется динамически. –