Форум сайта python.su
уже очень долго бьюсь с этой задачей, никак не могу распараллелить приведенный ниже цикл. Может кто подскажет как это сделать?
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];
}
Офлайн
Ваши три цикла разворачиваются в очень длинную простыню примитивных вычислений, каждое из которых не зависит от других.
Пока не попробуете, ничего не получится.
Офлайн
daemvil
Никогда не занимался GPGPU. Просто праздное любопытство. А почему pyCUDA, а не pyOpenCL? Последняя ведь шире, открытее и все такое. Или у NVIDIA проблемы с поддержкой?
Офлайн
Subideal Oxвремени нет выбирать между ними ) Поскольку у меня “длинная простыня примитивных вычислений”, то выбирать что лучше наверное не имеет смысла. Если конечно в OpenCL нет функции вычисления длинных корреляционных функций )))
daemvil
Никогда не занимался GPGPU. Просто праздное любопытство. А почему pyCUDA, а не pyOpenCL? Последняя ведь шире, открытее и все такое. Или у NVIDIA проблемы с поддержкой?
Офлайн
решил двигаться от простого к сложному написал основываясь на примере 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]
Офлайн
сделал вот так
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]);
}
Офлайн
кое что наваял, только экран мигает, а потом ошибку пишет после того как добавил“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))
Отредактировано (Янв. 30, 2011 20:40:51)
Офлайн