LINUX.ORG.RU

Избранные сообщения UTKA

Метод прогонки для разделяемой памяти. Видимо совсем запуталась в индексах.

Форум — Development

Решаю трехдиагональные матрицы методом прогонки. z- число систем,n- число уравнений в системе.Не правильно считает элементы массива.Первый раз работаю с разделяемой памятью и не могу сообразить как правильно проставлять индексы. Сам код работает, а при выводе элемента массива на экран выдает невозможные значения.Помогите,пожалуйста, найти ошибку.

const int l = 128;
__global__ void func(int n, float *a, float *b, float *c, float *f, float *x)
{

	__shared__ float bufa[l];// разделяемая память
	__shared__ float bufb[l];
	__shared__ float bufc[l];
	__shared__ float buff[l];
	__shared__ float bufx[l];
	__shared__ float alpha[l];
	__shared__ float betta[l];
	int j = threadIdx.x;
	int r = j*n;
	float m;
	for (int i = 1; i<n*l; i++)
	{
		bufa[i] = a[blockIdx.x*n + i];// запись значений из глобальной памяти в разделяемую
	}
	for (int i = 0; i<n*l - 2; i++)
	{
		bufb[i] = b[blockIdx.x*n + i];
	}
	for (int i = 0; i<n*l - 1; i++)
	{
		bufc[i] = c[blockIdx.x*n + i];
	}
	for (int i = 0; i < n*l; i++)
	{
		buff[i] = f[blockIdx.x*n + i];
	}
	for (int i = 0; i<n*l; i++)
	{
		bufx[i] = x[blockIdx.x*n+ i];

	}

	__syncthreads();

	for (int i = 1 ; i < n ; i++)
	{
	m = bufa[i+r] / bufc[i - 1+r];
	bufc[i+r] = bufc[i+r] - m*bufb[i - 1+r];
	buff[i+r] = buff[i+r] - m*buff[i - 1+r];
	}
	__syncthreads();
	bufx[n - 1 + r] = buff[n - 1 + r] / bufc[n - 1 + r];
	for (int i = n - 1 ; i >= 0; i--){
		bufx[i] = (buff[i+r] - bufb[i+r] * bufx[i + 1+r]) / bufc[i+r];
		
	}
}

 ,

UTKA
()