Я пытаюсь написать код, который свернул 3D -изображение с 3D -вейвлет -ядром, которое можно описать с использованием трех независимых параметров. Я хочу проанализировать результаты свертки для всех комбинаций трех параметров, используемых для генерации вейвлета. Создайте ядро для данного набора параметров (петля над i, j, k) и конвертируйтесь с изображением. /p>
Я думаю, что проблема по сути сводится к мне, используя Cupy в вложенной для петли, но я действительно не знаю, как избежать замедления, которое я получаю. Может быть, это связано с очередью памяти? Тем не менее, мои изображения довольно большие (800x800x200), поэтому именно поэтому я пытаюсь сделать это партиями вместо параллельно. Программирование графического процессора в Python. Дайте мне знать, если я смогу уточнить, чтобы помочь вам помочь мне! < /P>
Вот фрагмент соответствующего кода, если он полезен для диагностики. Функция «Skern3» использует исключительно Cupy Arrays и возвращает Cupy Array. < /P>
from cupyx.scipy.ndimage import convolve as convolve_gpu
energy_const = (1/np.sqrt(xi_list**2+2*a**2))
x = cp.asarray(x)
y = cp.asarray(y)
z = cp.asarray(z)
xi_list = cp.asarray(xi_list)
theta_list = cp.asarray(theta_list)
phi_list = cp.asarray(phi_list)
a = cp.asarray(a)
fib_sum_log = cp.asarray(fib_sum_log)
energy_const = cp.asarray(energy_const)
# Pre-calculate wavelet energies (if needed)
wavelet_ener = cp.zeros(xi_list.size)
for k in range(xi_list.size):
xi = xi_list[k]
wavelet = S.skern3(x,y,z, a, theta_list[0], phi_list[0], xi) # Use arbitrary theta/phi for initial calc
wavelet_ener[k] = cp.sum(cp.abs(wavelet)**2)
# Pre-allocate output arrays on the GPU
trans_ener = cp.zeros((theta_list.size, phi_list.size, xi_list.size))
var_image = cp.zeros((theta_list.size, phi_list.size, xi_list.size))
max_image = cp.zeros((theta_list.size, phi_list.size, xi_list.size))
for i in range(theta_list.size):
start = time.time()
theta = theta_list
for j in range(phi_list.size):
phi = phi_list[j]
# Calculate wavelet *ONCE* for this theta and phi
for k in range(xi_list.size):
xi = xi_list[k]
wavelet = S.skern3(x,y,z, a, theta, phi, xi)
# No more freeing memory inside the loop!
G_Ixy = convolve_gpu(fib_sum_log, wavelet) # Make sure fib_sum_log is a CuPy array
print('Post Convolution')
print('mempool used bytes: ' + str(mempool.used_bytes()))
print('mempool total bytes: ' + str(mempool.total_bytes()))
print('pinned mempool free blocks: ' + str(pinned_mempool.n_free_blocks()))
print('=======================================================================\n')
images_wt = cp.multiply(energy_const[k], G_Ixy) # Make sure energy_const is a CuPy array
trans_ener[i, j, k] = cp.sum(cp.abs(G_Ixy)**2)
var_image[i, j, k] = cp.sqrt(cp.var(G_Ixy))
max_image[i, j, k] = cp.max(G_Ixy)
# Report time
end = time.time()
print('average time row ' + '{:.1f}'.format(100*i/num_tpoints) + ' [%]: ' + str(end-start) + ' s')
< /code>
Я попытался сделать все внутри петли для массива Cupy, чтобы избежать передачи накладных расходов. И это работает ... но мне нужно повторить, поэтому я не уверен, что я должен сделать. n_free_blocks () всегда возвращает 3-5 бесплатных блоков в закрепленной памяти. Я думаю, что это указывает на накладные расходы, но я не знаю, почему.
ценю любые советы.
Подробнее здесь: https://stackoverflow.com/questions/794 ... -execution
Cupy Ndimage Confolroting в вложенной для петли кажется быстрым, но следующее выполнение остановилось ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение