cula использование culaSgels - неверный аргумент?
Я пытаюсь использовать функцию culaSgels для решения Ax=B.
Я изменил пример systemSolve пакета cula.
void culaFloatExample()
{
int N=2;
int NRHS = 2;
int i,j;
double cula_time,start_time,end_time;
culaStatus status;
culaFloat* A = NULL;
culaFloat* B = NULL;
culaFloat* X = NULL;
culaFloat one = 1.0f;
culaFloat thresh = 1e-6f;
culaFloat diff;
printf("Allocating Matrices\n");
A = (culaFloat*)malloc(N*N*sizeof(culaFloat));
B = (culaFloat*)malloc(N*N*sizeof(culaFloat));
X = (culaFloat*)malloc(N*N*sizeof(culaFloat));
if(!A || !B )
exit(EXIT_FAILURE);
printf("Initializing CULA\n");
status = culaInitialize();
checkStatus(status);
// Set A
A[0]=1;
A[1]=2;
A[2]=3;
A[3]=4;
// Set B
B[0]=5;
B[1]=6;
B[2]=2;
B[3]=3;
printf("Calling culaSgels\n");
// Run CULA's version
start_time = getHighResolutionTime();
status = culaSgels('N',N,N, NRHS, A, N, A, N);
end_time = getHighResolutionTime();
cula_time = end_time - start_time;
checkStatus(status);
printf("Verifying Result\n");
for(i = 0; i < N; ++i){
for (j=0;j<N;j++)
{
diff = X[i+j*N] - B[i+j*N];
if(diff < 0.0f)
diff = -diff;
if(diff > thresh)
printf("\nResult check failed: X[%d]=%f B[%d]=%f\n", i, X[i+j*N],i, B[i+j*N]);
printf("\nResults:X= %f \t B= %f:\n",X[i+j*N],B[i+j*N]);
}
}
printRuntime(cula_time);
printf("Shutting down CULA\n\n");
culaShutdown();
free(A);
free(B);
}
я использую culaSgels('N',N,N, NRHS, A, N, A, N);
решить систему, но:
1) Результаты показывают мне, что каждый элемент X=0, но B прав. Кроме того, это показывает мне
Проверка результатов не удалась
2) Изучая справочное руководство, он говорит, что один аргумент перед последним аргументом (у ИИ) должен быть матрицей B, хранимой по столбцам, но если я использую "B" вместо "A" в качестве параметра, то я не получаю правильная матрица B.
1 ответ
Хорошо, для работы кода нужны 3 вещи.
1) Измените А на Б, так culaSgels('N',N,N, NRHS, A, N, B, N);
(Я неправильно понял, что на выходе B содержится решение)
2) Поскольку в CULA используются основные изменения столбцов A,B, соответственно.
3) Изменить на:
B = (culaFloat*)malloc(N*NRHS*sizeof(culaFloat));
X = (culaFloat*)malloc(N*NRHS*sizeof(culaFloat));
(используйте NHRS, а не N, что одинаково в этом примере)
Спасибо!