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

CUDA

Войти
Регистрация
Восстановить пароль
 
MegaC
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 27
#1

Свзяка CUDA + OpenGL - CUDA

02.03.2013, 13:30. Просмотров 347. Ответов 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 есть встроенные функции?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2013, 13:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Свзяка CUDA + OpenGL (CUDA):

Qt + OpenGL + Cuda - CUDA
Здравствуйте! Столкнулся я с такой проблемой: создаю QGLWidget, определяю функцию initializeGL() void GLWidget::initializeGL() { ...

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

CUDA C/C++ - CUDA
Всем доброго времени суток, кто нибудь объясните новичку в чем здесь ошибка, в ниже приведенной функции, в строке 25-ой, выдает...

CUDA - CUDA
Здравствуйте. Я мучаюсь с установкой куды на visual studio 2010. Сделал так, чтобы текст в файлах с расширением cu подсвечивался в C стиле,...

CUDA - CUDA
Добрый день! Не знал куда отнести эту тему, поэтому решил создать данную тему на ветке &quot;С#.NET&quot;, так как CUDA будет использоваться...

Cuda - CUDA
У меня на ноутбуке видеокарта ATI Mobility Radeon HD 4300 Series я хочу работать с CUDA какую видеокарту мне надо поставить подскажите? ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2013, 13:30
Привет! Вот еще темы с ответами:

CUDA - CUDA
Сталкивался кто-нибудь с этой технологией? Хотелось бы прочитать хотя бы пару предложений доступным языком. Или пару абзацев. Ну или ссылку...

C# + CUDA - CUDA
Слышал, о полезной штуковине – CUDA. Есть смысл изучить данный сабж, или это на много усложнит программу? Хочется использовать С# , а не С....

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

CUDA + FORTRAN - CUDA
Всем здрасте. Дошло до того, что мне нужно ускорить счет всяких многомерных сумм и интегралов на Fortran, в связи с чем хочу...


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

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

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