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

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

Восстановить пароль Регистрация
 
MegaC
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 27
02.03.2013, 13:30     Свзяка CUDA + OpenGL #1
Доброго всем дня.
Передо мной стоит задача реализовать параллельную прорисовку обычных прямых. Распараллеливать я решил с помощью 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 есть встроенные функции?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2013, 13:30     Свзяка CUDA + OpenGL
Посмотрите здесь:

CUDA C++ не понимаю ошибку! C++
C++ CUDA на примерах
C++ CUDA C/C++ сложение векторов
C++ Cuda не правильно считает
массивы в CUDA C++
Компиляция программ CUDA C++
CUDA toolkit C++
C++ CUDA C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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