Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
final_sleep
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19
#1

CUDA C++ не понимаю ошибку! - C++

05.01.2012, 02:35. Просмотров 1343. Ответов 2
Метки нет (Все метки)

Есть код на C
Считаем определитель. Подсчет определителя был реализован по методу Гаусса: приводим матрицу к треугольному виду и перемножаем диагональные элементы.

:
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
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 3
 
void matrix_rand (float array[SIZE][SIZE]), matrix_view (float array[SIZE][SIZE],char *q);
void subrow (float array[SIZE][SIZE], int m, int n, float k);
void determinant (float array[SIZE][SIZE]);
 
int main (void)
{
int i;
float mtx[SIZE][SIZE];
long double det;
puts ("C. Intel Core 2 Duo E6400");
matrix_rand(mtx);
puts ("Initial View\n");
matrix_view(mtx, "| %.0f ");
determinant(mtx);
puts ("Triangular\n");
matrix_view(mtx, "| %.4f ");
det=1;
for (i=0; i<SIZE; i++) {
  printf ("%.4f\n", mtx[i][i]);
  det*=mtx[i][i];
}
printf ("det=%.4Lf\n ", det);
getchar();
return 0;
}
 
void matrix_view (float array[SIZE][SIZE], char *q) {
        int i, j;
        for (i=0; i<SIZE; i++) {
                for (j=0; j<SIZE; j++)
                        printf (q, array[i][j]);
                puts ("");
        }
        puts ("");
}
 
void matrix_rand (float array[SIZE][SIZE]) {
        int i, j;
for (i=0; i<SIZE; i++)
  for (j=0; j<SIZE; j++) 
    array[i][j]=1+rand()%99;
                
}
 
void determinant (float array[SIZE][SIZE]) {
  int i, j;
  float coeff;
for (j=0; j<SIZE-1; j++) {
  if (!array[j][j]) subrow (array, j, SIZE-1, 1);
  for (i=j; i<SIZE-1; i++) {
    coeff=array[i+1][j]/array[j][j];
    subrow(array, i+1, j, coeff);
  }
}
}
 
void subrow (float array[SIZE][SIZE], int m, int n, float k) {
  int j;
  for (j=0; j<SIZE; j++)
    array[m][j]-=k*array[n][j];
}
Есть код на CUDA C++
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
#include <stdio.h>
#include <stdlib.h>
 
#define SIZE 3
 
__host__
void matrix_view (float (*array)[SIZE], char *q) {                  //вывод матрицы на экран
  int i, j;
  for (i=0; i<SIZE; i++) {
    for (j=0; j<SIZE; j++)
      printf (q, array[i][j]);
      puts ("");
    }
  puts ("");
}
 
__host__
void matrix_rand (float (*array)[SIZE]) {               //заполнение случайным образом на девайсе
  int i, j;
  for (i=0; i<SIZE; i++)
    for (j=0; j<SIZE; j++)
      array[i][j]=1+rand()%16;
}
 
__device__
void subrow (float (*array)[SIZE], int m, int n, float k) {         //вычитание строк на устройстве
  int g=blockIdx.y*blockDim.y+threadIdx.y;
  if(g<SIZE)
    array[m][g]-=k*array[n][g];
}
 
__global__
void determinant (float (*mtx)[SIZE]) {             //ядро: приведение к треугольному виду
  int i=i=blockIdx.x*blockDim.x+threadIdx.x;
  int j;
  float coeff;
  for (j=0; j<SIZE-1; j++) { 
    if (!mtx[j][j]) subrow (mtx, j, SIZE-1, 3);
    if (i>=j && i<SIZE-1) {
    coeff=mtx[i+1][j]/mtx[j][j]; 
    subrow(mtx, i+1, j, coeff);
    }
    __syncthreads();    
  }
}
 
int main (void) 
{ 
  int i;
  float mtx_h[SIZE][SIZE], (*mtx_d)[SIZE];
  long double det;
puts ("CUDA. NVIDIA GeForce 8800 GTS");
cudaMalloc ((void **)&mtx_d, sizeof(float)*SIZE*SIZE);          //выделение памяти на устройстве
puts ("Исходная матрица\n");
matrix_rand(mtx_h);
cudaMemcpy(mtx_d, mtx_h, sizeof(float)*SIZE*SIZE,       //копирование массива в память видеокарты
        cudaMemcpyHostToDevice);    
matrix_view(mtx_h, "| %.0f ");
dim3 threadsPerBlock(16, 16);
dim3 numBlock(SIZE/threadsPerBlock.x, SIZE/threadsPerBlock.y);
determinant<<<numBlock, threadsPerBlock>>>(mtx_d);                      //вызов ядра
cudaThreadSynchronize();
cudaMemcpy(mtx_h, mtx_d, sizeof(float)*SIZE*SIZE,       //копирование массива из памяти видеокарты
        cudaMemcpyDeviceToHost); 
puts ("Трeугольный вид\n");
matrix_view(mtx_h, "| %.8f ");
det=1;
for (i=0; i<SIZE; i++) {
  printf ("%.8f\n", mtx_h[i][i]);
  det*=mtx_h[i][i];
}
printf ("det=%.0Lf\n ", det);
cudaFree(mtx_d);
getchar();
return 0;
}
По идее все должно работать как часы, но CUDA C++ не делает Гаусса.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 02:35     CUDA C++ не понимаю ошибку!
Посмотрите здесь:

Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA - C++
uint* d_image_buffer; cudaAssertSuccess(cudaMalloc(&amp;d_image_buffer, WIDTH * HEIGHT)); dim3 block_size(16, 16); dim3...

не понимаю ошибку - C++
Написать программу, решающую задачу линейного поиска элемента в заданном вещественном массиве. _____ при вводе единицы выводит 0, ...

Не понимаю ошибку - C++
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; int main() { int n,i; float a; printf (&quot;\n a=&quot;); scanf ...

Выдает ошибку, не понимаю почему! - C++
Эта строка подчеркивает красным: if(strcmp(str,&quot;sin&quot;)==0) res=sin(res); #include &lt;iostream&gt; #include &lt;conio.h&gt; #include...

Не понимаю из-за чего n в 16 строке ошибку выдает? - C++
#include &lt;iostream&gt; using namespace std; int main() { const int N=31; float a; float sz=0; int n; ...

Не понимаю ошибку invalid conversion from 'int' to 'int* - C++
Код программы следующий #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; int swap (int *a, int *b, int *c) { ...

CUDA на примерах - C++
Скомпилировал из данной книги несколько вариантов программы(не важно какой): с глобальной, константной, текстурной памятью. Измерил, как...

CUDA toolkit - C++
От предыдущего вопроса про то как установить и где скомпилировать проект CUDA возник еще один вопрос.По сути нужен CUDA toolkit, но версий...

Массивы в CUDA - C++
выделение памяти на CPU для 2-мерного массива примерно выглядит так A=(float **)malloc(n*sizeof(float*)); for (int i=0;...

Cuda не правильно считает - C++
Здравствуйте, у меня тема курсовой работы &quot;Исследование технологии Cuda, и я решил что буду исследовать на примере перемножения двух...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт С++
1039 / 818 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
05.01.2012, 12:10     CUDA C++ не понимаю ошибку! #2
А вас не смущает разница в параметрах функций?
Ведь массив массивов и указатель на массив - немного разные вещи...
final_sleep
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19
06.01.2012, 00:54  [ТС]     CUDA C++ не понимаю ошибку! #3
сглупил.

Добавлено через 5 часов 48 минут
все еще не исправил
Ответ Создать тему
Опции темы

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