Форум программистов, компьютерный форум, киберфорум
Наши страницы

CUDA

Войти
Регистрация
Восстановить пароль
 
Danzel
6 / 6 / 3
Регистрация: 21.08.2012
Сообщений: 45
#1

Определитель матрицы на CUDA Cи - CUDA

09.02.2013, 21:44. Просмотров 1009. Ответов 1
Метки нет (Все метки)

Здравствуйте!
прошу прощения если я создал тему не в том разделе!
Надо написать программу которая вычисляет определитель матрицы 3х3 на CUDA C.
На С++ я написал программу и перенес ее на CUDA, ео столкнулся с проблемой вывода треугольной матрицы и подсчета определителя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <math.h>
 
#define SIZE 3
using namespace std;
 
__host__
void matrix_viewA (double A[SIZE][SIZE],char *q) {          //вывод матрицы на экран
  int i, j;
 for( i=0;i<SIZE;i++)
    {
        for( j=0;j<SIZE;j++)
        {
            cout<<A[i][j]<<"    ";
        }
        cout<<endl;
    }
 
 
  puts ("");
}
 
__host__
void matrix_viewK (double K[SIZE][SIZE],char *q) {          //вывод матрицы на экран
  int i, j;
 for( i=0;i<SIZE;i++)
    {
        for( j=0;j<SIZE;j++)
        {
            cout<<K[i][j]<<"    ";
        }
        cout<<endl;
    }
 
 
  puts ("");
}
 
 
 
 
 
__host__
void matrix_enter (double A[SIZE][SIZE]) {        //заполнение матрицы
  int i, j;
  for (i=0; i<SIZE; i++)
  {
    for (j=0; j<SIZE; j++)
    {
        cout<<"vvedite A["<<i<<"]["<<j<<"]"<<endl;
        cin>>A[i][j];
      //array[i][j]=1+rand()%16;
    }
  }
}
 
 
__global__
void determinant (double A[SIZE][SIZE],double b[SIZE],double K[SIZE][SIZE]) 
{        //ядро: приведение к треугольному виду
  int i=blockIdx.x*blockDim.x+threadIdx.x;
  int j=blockIdx.x*blockDim.x+threadIdx.x;
  double f;
  double znak=1;  
  double det=1;
  __syncthreads();
   for (int k = 0; k < SIZE; k ++)
    {
        for ( i = k + 1; i < SIZE; i ++)
        {
             f = A[i][k] / A[k][k];
            for ( j = 0; j < SIZE; j ++)
                A[i][j] -= A[k][j] * f;
            b[i] -= b[k] * f;
        }
    }
       
       for(i=0;i<SIZE;i++)
       {
           for(j=0;j<SIZE;j++)
           {
               A[i][j]=K[i][j];
           }
       }
 
 
       for(int k=0; k<SIZE; k++)
       {
            det=det*K[k][k]*znak;
       }
  
 
      __syncthreads();  
  
}
 
int main (void) 
{ 
  int i,znak=1;
  double A[SIZE][SIZE], (*mtx_d)[SIZE],b[SIZE],K[SIZE][SIZE]; // определяем переменные 
  double det=1; //переменная для определителя
 
cudaMalloc ((void**)&mtx_d, sizeof(double)*SIZE*SIZE);      //выделение памяти на устройстве
 
matrix_enter(A); // вызываем функцию для заполнения матрицы
cudaMemcpy(mtx_d, A, sizeof(double)*SIZE*SIZE,     //копирование массива в память видеокарты
    cudaMemcpyHostToDevice); 
puts ("na4al'naya matrica\n");
matrix_viewA(A, " | %.2f "); // выводим нашу матрицу на экран
dim3 dimBlock(16, 16);
dim3 numBlock(SIZE/dimBlock.x, SIZE/dimBlock.y);
determinant<<<numBlock, dimBlock>>>(mtx_d,b,K);            //вызов ядра
cudaThreadSynchronize();
cudaMemcpy(A, mtx_d, sizeof(double)*SIZE*SIZE,     //копирование массива из памяти видеокарты
    cudaMemcpyDeviceToHost); 
puts ("triangl vid\n");
matrix_viewA(K, "| %.2f ");
for(int k=0; k<SIZE; k++)
{
            det=det*K[k][k]*znak;
}
printf ("det=%.0Lf\n ", det);
cudaFree(mtx_d),cudaFree(b),cudaFree(A);
system("pause");
getchar();
return 0;
 
}
Прошу небольшой помощи или совета!
Заранее спасибо))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2013, 21:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определитель матрицы на CUDA Cи (CUDA):

Вычисление определителя матрицы (cuda) - CUDA
Здравствуйте, нужна помощь с кодом. Есть исполняющийся код, который вычисляет определитель матрицы на cuda (метод Гаусса). Но его...

Не запускается приложение под Cuda (CUDA directory not found) - CUDA
Здравствуйте, пытаюсь скомпилировать приложение под Cuda но вылазит ошибка, что CUDA directory not found. В чем может быть проблема? Cuda...

Загадка перемножения матрицы на вектор с применением nVidia CUDA - CUDA
Загадка перемножения матрицы на вектор с применением nVidia CUDA/ http://landwatersun.ru/viewtopic.php?id=170

Как вычислить определитель матрицы, содержащей переменную (один из элементов матрицы равен x*x+9) - MathCAD
как вычислить определитель матрицы содержащей переменную в mathcad? (один из элементов матрицы равен x*x+9).Желательно как можно подробно...

Определитель матрицы, ранг матрицы, обратная матрица - C++
Вы можете помочь, сделать определитель матрицы, или у кого есть коде: ранг матрицы, обратная матрица, или другие действия с матрицами.

Определитель матрицы - VBA
Может у кого есть готовый код, как найти определитель матрицы N*N?

1
I.M.
566 / 549 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
10.02.2013, 04:13 #2
Danzel, очень странная реализация. Зачем куда, если вычисления идут в одном потоке?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2013, 04:13
Привет! Вот еще темы с ответами:

Определитель Матрицы - Delphi
Всем привет! у меня возникла проблема. Я считаю детерминант матрицы, когда он не равен нулю, все идет нормально, а когда равен выскакивает...

Определитель матрицы - C#
Добрый вечер, мне нужно было сделать прогу для вычисления определителя матрицы, сделал , неверные ответы выдает, уже искал и пытался менять...

Определитель матрицы - Turbo Pascal
срочно нужна программа вычисляющая определитель матрицы n*n

Определитель матрицы. - Turbo Pascal
Написать программу которая вычисляет определитель в квадратной матрице третьего порядка.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.