Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 28, 2011 17:38:42

daemvil
От:
Зарегистрирован: 2010-12-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

CUDA - распараллеливание цикла (pyCUDA)

уже очень долго бьюсь с этой задачей, никак не могу распараллелить приведенный ниже цикл. Может кто подскажет как это сделать?

for (int k1=1;k1<=16;k1++) 
for (int t1=0;t1<=NPackets;t1++) //t=0...T
for (int t2=t1;t2<=NPackets;t2++) //k=t...T
{
vzaimkorr[k1][t2-t1]=vzaimkorr[k1][t2-t1]+kans[vk[k1][1]][t1]*kans[vk[k1][2]][t2];
}
NPackets - число точек(их 21000000, можно конечно взять пачками по 75000 точек, если это упростит задачу)
vzaimkorr - двухмерный массив из 16 корреляционных функций по NPackets точек типа float. (16xNPackets)
vk - двухмерный массив индексов 16х2 (нужен для взаимнокорреляционных функций, это “комбинации” каналов kans)
kans - массивы данных для обработки (16хNPackets)

допустим k1 можно раскидать на 16 блоков
а с остальными циклами как быть? особенно с последним, который от t1 до NPackets. я слышал, что видеокарты сейчас вроде как циклы сами распараллеливают некоторые, будет ли это эффективно здесь?



Офлайн

#2 Янв. 28, 2011 21:26:11

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

CUDA - распараллеливание цикла (pyCUDA)

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



Офлайн

#3 Янв. 29, 2011 10:01:14

Subideal Ox
От:
Зарегистрирован: 2010-11-23
Сообщения: 65
Репутация: +  0  -
Профиль   Отправить e-mail  

CUDA - распараллеливание цикла (pyCUDA)

daemvil
Никогда не занимался GPGPU. Просто праздное любопытство. А почему pyCUDA, а не pyOpenCL? Последняя ведь шире, открытее и все такое. Или у NVIDIA проблемы с поддержкой?



Офлайн

#4 Янв. 29, 2011 11:46:10

daemvil
От:
Зарегистрирован: 2010-12-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

CUDA - распараллеливание цикла (pyCUDA)

Subideal Ox
daemvil
Никогда не занимался GPGPU. Просто праздное любопытство. А почему pyCUDA, а не pyOpenCL? Последняя ведь шире, открытее и все такое. Или у NVIDIA проблемы с поддержкой?
времени нет выбирать между ними ) Поскольку у меня “длинная простыня примитивных вычислений”, то выбирать что лучше наверное не имеет смысла. Если конечно в OpenCL нет функции вычисления длинных корреляционных функций )))



Офлайн

#5 Янв. 30, 2011 12:45:30

daemvil
От:
Зарегистрирован: 2010-12-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

CUDA - распараллеливание цикла (pyCUDA)

решил двигаться от простого к сложному написал основываясь на примере hellogpu.py
вот код

import pycuda.driver as drv
import pycuda.tools
import pycuda.autoinit
import numpy
import numpy.linalg as la
from pycuda.compiler import SourceModule

mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x;
for (int t1=1;t1<=81920;t1++)
{
dest[i] = a[t1]*a[t1]+b[1]; //fmaf(a[t1],a[t1],b[0]);
}
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn(81921).astype(numpy.float32)
b = numpy.random.randn(81921).astype(numpy.float32)

dest = numpy.zeros_like(a)
multiply_them(
drv.Out(dest), drv.In(a), drv.In(b),
grid=(16,1),
block=(512,1,1))

print b[0]
Отрабатывает нормально, считает, но если размер массива ставить больше (например в 10 раз пробовал), то при выполнении кода появляется синий экран смерти :( из-за чего это может быть?



Офлайн

#6 Янв. 30, 2011 18:19:05

daemvil
От:
Зарегистрирован: 2010-12-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

CUDA - распараллеливание цикла (pyCUDA)

сделал вот так

 const int i = (threadIdx.x + blockIdx.x * blockDim.x)*1000; 
for (int t1=0;t1<=999;t1++)
{
dest[i+t1] = a[i+t1]*a[i+t1]+dest[i+t1]; //fmaf(a[t1],a[t1],b[0]);
}
и массив на 8192000 элементов. все отрабатывает нормально. но почему-то если цикл делать длинный, то BSOD выдает все равно



Офлайн

#7 Янв. 30, 2011 20:27:46

daemvil
От:
Зарегистрирован: 2010-12-24
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

CUDA - распараллеливание цикла (pyCUDA)

кое что наваял, только экран мигает, а потом ошибку пишет после того как добавил“const int i1 = threadIdx.y + blockIdx.y * blockDim.y;”, добавил в ядро условие if и объявил сетку не 65535, а , не могу понять что я не так делаю? :(

import pycuda.driver as drv
import pycuda.tools
import pycuda.autoinit
import numpy
import numpy.linalg as la
from pycuda.compiler import SourceModule

mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
const int i = threadIdx.x + blockIdx.x * blockDim.x;
const int i1 = threadIdx.y + blockIdx.y * blockDim.y;
if (i+i1 < 33553921)
dest[i1] = fmaf(a[i],a[i+i1],dest[i1]); //a[]*a[]+dest[]
__syncthreads();
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn(33553921).astype(numpy.float32)
b = numpy.random.randn(33553921).astype(numpy.float32)

dest = numpy.zeros_like(a)
print "run..."
multiply_them(
drv.Out(dest), drv.In(a), drv.In(b),
grid=(65535,65535),
block=(512,1,1))
вот лог:

C:\Python27>kor.py
C:\Python27\lib\site-packages\pycuda\compiler.py:112: UserWarning: The CUDA compiler suceeded, but said the following:
kernel.cu
kernel.cu
tmpxft_00000fe0_00000000-3_kernel.cudafe1.gpu
tmpxft_00000fe0_00000000-10_kernel.cudafe2.gpu

+stdout+stderr)
run…
Traceback (most recent call last):
File “C:\Python27\kor.py”, line 35, in <module>
block=(512,1,1))
File “C:\Python27\lib\site-packages\pycuda\driver.py”, line 189, in function_call
Context.synchronize()
pycuda._driver.LaunchError: cuCtxSynchronize failed: launch timeout
Error in atexit._run_exitfuncs:
Traceback (most recent call last):
File “C:\Python27\lib\atexit.py”, line 24, in _run_exitfuncs
func(*targs, **kargs)
LaunchError: cuCtxPopCurrent failed: launch timeout
Error in sys.exitfunc:
PyCUDA WARNING: a clean-up operation failed (dead context maybe?)
cuMemFree failed: invalid context
PyCUDA WARNING: a clean-up operation failed (dead context maybe?)
cuMemFree failed: invalid context
PyCUDA WARNING: a clean-up operation failed (dead context maybe?)
cuMemFree failed: invalid context
Traceback (most recent call last):
File “C:\Python27\lib\atexit.py”, line 24, in _run_exitfuncs
func(*targs, **kargs)
pycuda._driver.LaunchError: cuCtxPopCurrent failed: launch timeout
PyCUDA WARNING: a clean-up operation failed (dead context maybe?)
cuModuleUnload failed: invalid context
——————————————————————-
PyCUDA ERROR: The context stack was not empty upon module cleanup.
——————————————————————-
A context was still active when the context stack was being
cleaned up. At this point in our execution, CUDA may already
have been deinitialized, so there is no way we can finish
cleanly. The program will be aborted now.
Use Context.pop() to avoid this problem.
——————————————————————-

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.



Отредактировано (Янв. 30, 2011 20:40:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version