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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
final_sleep
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19
05.01.2012, 02:35     CUDA C++ не понимаю ошибку! #1
Есть код на 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++ не понимаю ошибку!
Посмотрите здесь:

Выдает ошибку, не понимаю почему! C++
C++ CUDA на примерах
C++ Не понимаю ошибку
C++ Cuda не правильно считает
массивы в CUDA C++
не понимаю ошибку C++
CUDA toolkit C++
C++ CUDA C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
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 минут
все еще не исправил
Yandex
Объявления
06.01.2012, 00:54     CUDA C++ не понимаю ошибку!
Ответ Создать тему
Опции темы

Текущее время: 07:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru