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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти количество отрицательных чисел среди заданных http://www.cyberforum.ru/cpp-beginners/thread422643.html
Я решил начать изучать С++ сейчас читаю учебник и не могу сделать упражнение: "Напишите программу,запрашивающую у пользователя несколько значений и отображающую сообщение о количестве отрицательных чисел среди них." Если можно то чуть обьясните.
C++ Найти для каждого массива количество элементов, значение которых меньше среднего между минимальным... • Для выполнения всех расчетов использовать несколько функций, каждая из которых выполняет отдельную задачу:  ввод данных;  печать массива;  вывод результатов;  нахождение промежуточных и конечных результатов • Тип функций, при возвращении промежуточных данных выбрать самостоятельно и обосновать. • Рассмотреть описание массива с помощью указателя. Варианты заданий Подразумевается,... http://www.cyberforum.ru/cpp-beginners/thread422642.html
[C++] Хелп в чем ошибки C++
1) составить программу, котороя распечатывает значения функций 10*N,100*N и 1000*N, для N=1....10 с шагом изменения N равным 2. #include <iostream> use namespace std; int main() { for (int n = 1; n <= 10; n += 2) { cout << n * 10 << " " << n * 100 << " " << n * 1000 << "\n";
Программа с массивами при использовании подпрограммы C++
Написать программу в которой использована подпрограмма в виде функции для формирования и обработки массивов. Массивы должны быть описаны в основной программе. Формирование, вывод и обработка массивов выполняются в подпрограмме при вызове ее из главной программы. Заданы массивы C (12), D (25), E (20). Для каждого из массивов найти отношение максимального элемента к минимальному, а также –...
C++ Масштабирование http://www.cyberforum.ru/cpp-beginners/thread422628.html
Здравствуйте. Не могли бы вы подсказать реализацию/теорию(где почитать) про алгоритмы масштабирования? У меня есть монохромные матрицы из нулей-единиц, которые надо растянуть/уменьшить, привести к эталонной. Думаю, подойдут даже самые простейшие алгоритмы с большими искажениями. Спасибо.
C++ Не работает Первый пример из книжки IDE KDevelop. Пример, которые был при создании проекта, компилируется без ошибок. Вот пример из книжки, который я пытаюсь скомпилировать: Counter.h #ifndef _Counter_h_ #define _Counter_h_ #include <QObject> // ====================================================================== подробнее

Показать сообщение отдельно
final_sleep
0 / 0 / 0
Регистрация: 12.12.2010
Сообщений: 19

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

05.01.2012, 02:35. Просмотров 1329. Ответов 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++ не делает Гаусса.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru