Найти - Пользователи
Полная версия: CUDA - распараллеливание цикла (pyCUDA)
Начало » Python для новичков » CUDA - распараллеливание цикла (pyCUDA)
1
daemvil
уже очень долго бьюсь с этой задачей, никак не могу распараллелить приведенный ниже цикл. Может кто подскажет как это сделать?
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. я слышал, что видеокарты сейчас вроде как циклы сами распараллеливают некоторые, будет ли это эффективно здесь?
Андрей Светлов
Ваши три цикла разворачиваются в очень длинную простыню примитивных вычислений, каждое из которых не зависит от других.
Пока не попробуете, ничего не получится.
Subideal Ox
daemvil
Никогда не занимался GPGPU. Просто праздное любопытство. А почему pyCUDA, а не pyOpenCL? Последняя ведь шире, открытее и все такое. Или у NVIDIA проблемы с поддержкой?
daemvil
Subideal Ox
daemvil
Никогда не занимался GPGPU. Просто праздное любопытство. А почему pyCUDA, а не pyOpenCL? Последняя ведь шире, открытее и все такое. Или у NVIDIA проблемы с поддержкой?
времени нет выбирать между ними ) Поскольку у меня “длинная простыня примитивных вычислений”, то выбирать что лучше наверное не имеет смысла. Если конечно в OpenCL нет функции вычисления длинных корреляционных функций )))
daemvil
решил двигаться от простого к сложному написал основываясь на примере 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 раз пробовал), то при выполнении кода появляется синий экран смерти :( из-за чего это может быть?
daemvil
сделал вот так
 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 выдает все равно
daemvil
кое что наваял, только экран мигает, а потом ошибку пишет после того как добавил“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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB