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

Свзяка CUDA + OpenGL - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Не работает PlaySound http://www.cyberforum.ru/cpp-beginners/thread798513.html
#include <iostream> #include <windows.h> #include <string> #include <conio.h> #include <fstream> #include <iomanip> #include <stdio.h> #include <mmsystem.h> using namespace std;
C++ не могу использовать методы класса В общем только что добралась до изучения классов .придумала класс собака, к котором есть координаты собаки и кол-во костей которое есть у собаки.Сделала 2 член функции movedog и releasedata(типо отображать данные) вот как это выгледит у меня class dog { public: void movedog( int dx,int dy) { x+=dx; y+=dy; http://www.cyberforum.ru/cpp-beginners/thread798509.html
Вывод определенного элемента массива из массива символов C++
Имеется символьный массив char, нужно вывести на экран произвольный элемент этого массива. Сделал так: #include <iostream> #include "stdafx.h" int main() { char b; gets(b); printf("%s \n", &b);
Конец программы C++
Здравствуйте! Подскажите, пожалуйста, почему консоль закрывается когда получает все три переменные? #include <iostream> using namespace std; int main() { setlocale(LC_ALL,"Russian"); int a, b, c; cout <<"Введите число a" << endl; cin >> a; cout <<"Введите число b" << endl;
C++ Dev-C++ http://www.cyberforum.ru/cpp-beginners/thread798479.html
Нажимаю "скомпилировать", компиляция проходит успешно, но когда жму "выполнить", появляется предупреждение "Проект не откомпиирован". Подскажите, что делать? Где-то видела, как человек вручную писал "Complile file", имя файла и т.д. Скажите, пожалуйста, где это нужно писать? Или что ещё сделать, чтобы программа выполнилась? Не компилируется не только этот, а вообще любой код. #include...
C++ Массив: создать массив: отрицательные элементы массива а + отрицательные элементы b Помогите написать программу на языке С++ 1)Из двух массивов a, a, ..a b,b....b создать следующие массивы: а) отрицательные элементы массива а+ отрицательные элементы b; 2)Из двух массивов a, a, ..a b,b....b создать следующие массивы: а) отрицательные элементы массива b + отрицательные элементы а; подробнее

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

Свзяка CUDA + OpenGL - C++

02.03.2013, 13:30. Просмотров 327. Ответов 0
Метки (Все метки)

Доброго всем дня.
Передо мной стоит задача реализовать параллельную прорисовку обычных прямых. Распараллеливать я решил с помощью Cuda и рисовать с помощью OpenGL. Но столкнулся с проблемой: в фукции, которою мы распаралелливаем нельзя рисовать.
Т.е выдает ошибку:
Bash
1
Error   3   error : calling a __host__ function("glVertex2f") from a __global__ function("line") is not allowed
Вот код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <GL/glut.h>
#include <cmath>
#include <stdio.h>
#include <conio.h>
#include <cuda.h>
//using namespace cpl;
int a = 0;
float b = 0;
// Kernel that executes on the CUDA device
__global__ void line(double *d)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    glBegin(GL_LINES);
    glVertex2f(15.0, 15.0);
    glVertex2f(15.0+20, 15.0+20);
    glEnd();
}
 
void display()
{
  double *a_h, *a_d;  // Pointer to host & device arrays;  // Pointer to host & device arrays
  const int N = 5;  // Number of elements in arrays
  size_t size = sizeof(double);
  a_h = (double *)malloc(size);        // Allocate array on host
  cudaMalloc((void **) &a_d, size);   // Allocate array on device
  // Initialize host array and copy it to CUDA device
  for (int i=0; i<N; i++) a_h[i] = (double)i;
  cudaMalloc((void**) a_d, size);   // Allocate array on device
  // Initialize host array and copy it to CUDA device
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  // Do calculation on device:
  int block_size = 5;
  int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 0.0, 0.0);
  line <<< n_blocks, block_size >>> (a_d);
  glutSwapBuffers();
  // Retrieve result from device and store it in host array
  cudaMemcpy(a_h, a_d, sizeof(double), cudaMemcpyDeviceToHost);
  //  free(a_h); 
  cudaFree(a_d);
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(400, 300);
    //glutInitWindowPosition(100, 740);
    glutCreateWindow("Test");
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 100, 0, 100, 0, 100);
 
    glutDisplayFunc(display);
    glutMainLoop();
}



Дальше я решил вынести прорисовку в отдельную функцию. Но данная затея так же была обречена:

Bash
1
Error   1   error : calling a __host__ function("mass") from a __global__ function("line") is not allowed
Вот код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <GL/glut.h>
#include <cmath>
#include <stdio.h>
#include <conio.h>
#include <cuda.h>
//using namespace cpl;
int a = 0;
float b = 0;
// Kernel that executes on the CUDA device
void mass(double b)
{
    glBegin(GL_LINES);
    glVertex2f(15.0+b*10, 15.0);
    glVertex2f(15.0+20, 15.0+20);
    glEnd();
}
__global__ void line(double *d)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    mass(d[idx]);
}
 
void display()
{
  double *a_h, *a_d;  // Pointer to host & device arrays;  // Pointer to host & device arrays
  const int N = 5;  // Number of elements in arrays
  size_t size = sizeof(double);
  a_h = (double *)malloc(size);        // Allocate array on host
  cudaMalloc((void **) &a_d, size);   // Allocate array on device
  // Initialize host array and copy it to CUDA device
  for (int i=0; i<N; i++) a_h[i] = (double)i;
  cudaMalloc((void**) a_d, size);   // Allocate array on device
  // Initialize host array and copy it to CUDA device
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  // Do calculation on device:
  int block_size = 5;
  int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 0.0, 0.0);
  line <<< n_blocks, block_size >>> (a_d);
  glutSwapBuffers();
  // Retrieve result from device and store it in host array
  cudaMemcpy(a_h, a_d, sizeof(double), cudaMemcpyDeviceToHost);
  //  free(a_h); 
  cudaFree(a_d);
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(400, 300);
    //glutInitWindowPosition(100, 740);
    glutCreateWindow("Test");
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 100, 0, 100, 0, 100);
 
    glutDisplayFunc(display);
    glutMainLoop();
}



Пробовал вызывать функцию перед которой прописывал __host__ __device__

Вот код:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <GL/glut.h>
#include <cmath>
#include <stdio.h>
#include <conio.h>
#include <cuda.h>
using namespace cpl;
int a = 0;
float b = 0;
// Kernel that executes on the CUDA device
__host__ __device__ void mass(double b)
{
    glBegin(GL_LINES);
    glVertex2f(15.0+b*10, 15.0);
    glVertex2f(15.0+20, 15.0+20);
    glEnd();
}
__global__ void line(double *d)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    mass(d[idx]);
}
 
void display()
{
  double *a_h, *a_d;  // Pointer to host & device arrays;  // Pointer to host & device arrays
  const int N = 5;  // Number of elements in arrays
  size_t size = sizeof(double);
  a_h = (double *)malloc(size);        // Allocate array on host
  cudaMalloc((void **) &a_d, size);   // Allocate array on device
  // Initialize host array and copy it to CUDA device
  for (int i=0; i<N; i++) a_h[i] = (double)i;
  cudaMalloc((void**) a_d, size);   // Allocate array on device
  // Initialize host array and copy it to CUDA device
  cudaMemcpy(a_d, a_h, size, cudaMemcpyHostToDevice);
  // Do calculation on device:
  int block_size = 5;
  int n_blocks = N/block_size + (N%block_size == 0 ? 0:1);
  glClear(GL_COLOR_BUFFER_BIT);
  glColor3f(1.0, 0.0, 0.0);
  line <<< n_blocks, block_size >>> (a_d);
  glutSwapBuffers();
  // Retrieve result from device and store it in host array
  cudaMemcpy(a_h, a_d, sizeof(double), cudaMemcpyDeviceToHost);
  //  free(a_h); 
  cudaFree(a_d);
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(400, 300);
    //glutInitWindowPosition(100, 740);
    glutCreateWindow("Test");
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 100, 0, 100, 0, 100);
 
    glutDisplayFunc(display);
    glutMainLoop();
}


В таком случае выдает ошибку:
Bash
1
Warning 2   warning : calling a __host__ function("glVertex2f") from a __host__ __device__ function("mass") is not allowed

Вариант с пост-прорисовкой отпадает(вычислением всех координат и занесением их в общий массив). Поскольку на входе будет очень и очень много прямых.

Как я понял я делаю прорисовку вообще не в том ключе. Как это можно и нужно делать в CUDA?

Добавлено через 1 час 32 минуты
Может не нужен мне никакой OpenGL и у CUDA есть встроенные функции?
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru