LINUX.ORG.RU

Не работает разделяемая память.

 ,


0

1

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

/**
	 * n - число уравнений (строк матрицы)
	 * b - диагональ, лежащая над главной (нумеруется: [0;n-2])
	 * c - главная диагональ матрицы A (нумеруется: [0;n-1])
	 * a - диагональ, лежащая под главной (нумеруется: [1;n-1])
	 * f - правая часть (столбец)
	 * x - решение, массив x будет содержать ответ
	 */
void solveMatrix (int n, double *a, double *c, double *b, double *f, double *x)
{
	double m;
	for (int i = 1; i < n; i++)
	{
		m = a[i]/c[i-1];
		c[i] = c[i] - m*b[i-1];
		f[i] = f[i] - m*f[i-1];
	}

	x[n-1] = f[n-1]/c[n-1];

	for (int i = n - 2; i >= 0; i--)
		x[i]=(f[i]-b[i]*x[i+1])/c[i];

}

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

__global__ void func(int n, float *a, float *b, float *c, float *f, float *x)
{
	
	int j = blockDim.x* blockIdx.x + threadIdx.x;
	int r = j*z;
	float m;
	__shared__ float *abuf;
	__shared__ float *bbuf;
	__shared__ float *cbuf;
	__shared__ float *fbuf;
	__shared__ float *xbuf;

	for (int i = 1; i < n*s; i++)
	{
		abuf[i] = a[blockIdx.x*z + i];// запись значений из глобальной памяти в разделяемую
		__syncthreads();
	
	}
	for (int i = 0; i < (n - 2)*s; i++)
	{
		
		bbuf[i] = b[blockIdx.x*z + i];
		__syncthreads();
		
	}
	for (int i = 0; i < (n - 1)*s; i++)
	{
		
		cbuf[i] = c[blockIdx.x*z + i];
		__syncthreads();
		
	}
	for (int i = 0; i < n*s; i++)
	{
		
		fbuf[i] = f[blockIdx.x*z + i];
		__syncthreads();
		
	}
	for (int i = 0; i < n*s; i++)
	{
		
		xbuf[i] = x[blockIdx.x*z + i];
		__syncthreads();
		
	}
		for (int i = 1+r ; i < n+r ; i++) //от 0 до z
	{
		m = abuf[i] / cbuf[i - 1];
		cbuf[i] = cbuf[i] - m*bbuf[i - 1];
		fbuf[i] = fbuf[i] - m*fbuf[i - 1];
	}

	xbuf[n - 1 ] = fbuf[n - 1 ] / cbuf[n - 1];

	for (int i = n - 2 +r; i >= r; i--){
		xbuf[i] = (fbuf[i] - bbuf[i] * xbuf[i + 1]) / cbuf[i];
	}
for (int i = n - 2 +r; i >= r; i--){
		x[i]=xbuf[blockIdx.x*z + i];
	}

}


код еще бредовее... в общем, либо размерность влазит в один блок (<=1024, для типичных условий), либо алгоритм разделим на независимые по данным блоки, либо __shared__ непременим для общения между блоками

__shared__ указатели и sharedVar[blockIdx.*] - это бред, правильная семантика - sharedArray[threadIdx.*]

советую ограничиться глобальной памятью, там кэш амортизирует скорость, либо RTFM

anonymous
()

начни с более простых сценариев и изучи поведение всех типов памяти

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

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от anonymous

Спасибо. Мне дали задачу именно для разделяемой памяти, к сожалению.

UTKA
() автор топика

Пыталась писать по учебникам, но про sharedArray[threadIdx.*] первый раз слышу,если честно. Инициализацию массивов в разделяемой памяти мне так сказал написать преподаватель. Моя ошибка в передачу в разделяемую память? К сожалению, за помощью обратиться совсем не к кому, а задачу необходимо решить срочно. Как выйти из положения? Для глобальной памяти код уже написан.

UTKA
() автор топика
Ответ на: комментарий от UTKA

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

Это часть обучения. Ситуации, когда нужно сделать, но ничего не получается, ничего не понятно, и некого спросить, во время работы будут постоянно. Отчаяние — это нормально.

Самая правильная помощь в этом случае — не помогать.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Может тогда подскажете литературу? я действительно ничего адекватного не могу найти на эту тему.

UTKA
() автор топика
Ответ на: комментарий от UTKA

Я бы начал с официальной документации. Давно её не открывал, но раньше она была хорошая и понятная. Затем реализовать какие-нибудь простенькие ядра, использующие разделяемую память, а уже потом эту задачу.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.