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

CUDA

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

Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA - CUDA

05.11.2015, 14:21. Просмотров 362. Ответов 9
Метки нет (Все метки)

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
uint* d_image_buffer;
  cudaAssertSuccess(cudaMalloc(&d_image_buffer, WIDTH * HEIGHT));
  dim3 block_size(16, 16);
  dim3 grid_size(WIDTH / block_size.x, HEIGHT / block_size.y);
  calc<<<grid_size, block_size>>>(d_image_buffer);
  cudaAssertSuccess(cudaPeekAtLastError());
  cudaAssertSuccess(cudaDeviceSynchronize());
  cudaAssertSuccess(cudaMemcpy(image_buffer, d_image_buffer, HEIGHT * WIDTH, cudaMemcpyDeviceToHost));
  cudaAssertSuccess(cudaFree(d_image_buffer));
}
 
__global__ void calc(uint image_buffer)
{
  int row = blockIdx.y * blockDim.y + threadIdx.y;  // WIDTH
  int col = blockIdx.x * blockDim.x + threadIdx.x;  // HEIGHT
  int idx = row * WIDTH + col;
  if(col >= WIDTH || row >= HEIGHT) return;
 
  float x0 = ((float)col / WIDTH) * 3.5f - 2.5f;
  float y0 = ((float)row / HEIGHT) * 3.5f - 1.75f;
 
  float x = 0.0f;
  float y = 0.0f;
  int iter = 0;
  float xtemp;
  while((x * x + y * y <= 4.0f) && (iter < MAX_ITER))
  { 
    xtemp = x * x - y * y + x0;
    y = 2.0f * x * y + y0;
    x = xtemp;
    iter++;
  }
 
// вот так выводится в файл
FILE * pFile;
char name [100];
   pFile = fopen ("myfile.txt","w");
   for (int i=0 ; i<size ; i++)
   {  
     fprintf (pFile, "%d\n", image_buffer);
   }
   fclose (pFile);
Вот код считающий множество мандельброта, но почему то при выводе в файл, после строки №65536 начинает вместо правильных цифр выводить мусор (размер 512 на 512), помогите выяснить почему, возможности отлаживать код нету, выполнять приходится удаленно
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2015, 14:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA (CUDA):

Почему CUDA медленнее на простом коде? - CUDA
Добрый день! Написал простую программу сравнения многократного запуска на CUDA и на CPU Однако CUDA показывает 4539 мс на 1 миллион...

CUDA C++ не понимаю ошибку! - CUDA
Есть код на C Считаем определитель. Подсчет определителя был реализован по методу Гаусса: приводим матрицу к треугольному виду и...

Маленький супер-компьютер для вычислений с помощью видеокарт NVIDIA с применением технологии CUDA. - CUDA
В моей голове созрела идея собрать машину для вычислений с помощью видеокарт NVIDIA с применением технологии CUDA! Суть в том что, я в...

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

Считывание символа с помощью функции scanf: найти и исправить ошибку в коде - C++
Hello, world! Столкнулся с такой проблемой, как считывание символа с помощью функции scanf. Выкладываю два кода. Один исполняется...

Фрактал Мандельброта - Turbo Pascal
Реализовать программу, строящую фрактал с заданными границами расчета X0&lt;=X&lt;=Xn; Y0&lt;=Y&lt;=Yn. Мандельброта Заранее спасибо.

9
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 14:38 #2
Почему в файл пишется всегда одно значение?
0
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 14:40  [ТС] #3
Это я опечатался) Полного кода просто сейчас нет, остался на другом компе, но думаю что ошибка где то в ядре...
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 14:46 #4
Цитата Сообщение от grelik Посмотреть сообщение
Это я опечатался) Полного кода просто сейчас нет, остался на другом компе, но думаю что ошибка где то в ядре...
Давай только гадать не будем. Будет полный код, тогда и посмотрим.
0
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 15:09  [ТС] #5
Вот полный код:
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
#define WIDTH 512
#define HEIGHT 512
 
uint* createPixelColors()
 
{
 
 uint *dcolors;
 
 cudaMalloc(&dcolors, size);
 
 dim3 dimBlock(16, 16);
 
 dim3 dimGrid(WIDTH/dimBlock.x, HEIGHT/dimBlock.y);
 
 mandelbrotmenge <<<dimGrid, dimBlock>>>(dcolors, 32);
 
 uint *hcolors = new uint[size];
 
 cudaMemcpy(hcolors, dcolors, size, cudaMemcpyDeviceToHost);
 
 cudaFree(dcolors);
 
 return hcolors;
 
}
 
__global__ void calc(uint image_buffer)
{
  int row = blockIdx.y * blockDim.y + threadIdx.y;  // WIDTH
  int col = blockIdx.x * blockDim.x + threadIdx.x;  // HEIGHT
  int idx = row * WIDTH + col;
  if(col >= WIDTH || row >= HEIGHT) return;
 
  float x0 = ((float)col / WIDTH) * 3.5f - 2.5f;
  float y0 = ((float)row / HEIGHT) * 3.5f - 1.75f;
 
  float x = 0.0f;
  float y = 0.0f;
  int iter = 0;
  float xtemp;
  while((x * x + y * y <= 4.0f) && (iter < MAX_ITER))
  { 
    xtemp = x * x - y * y + x0;
    y = 2.0f * x * y + y0;
    x = xtemp;
    iter++;
  }
  int color = iter * 5;
  if (color >= 256) color = 0;
  image_buffer[idx] = color;
}
 
int main(int argc, char** argv)
{
int colors = createPixelColors();
FILE * pFile;
   pFile = fopen ("myfile.txt","w");
   for (int i=0 ; i<size ; i++)
   {  
     fprintf (pFile, "%d\n", colors[i]);
   }
   fclose (pFile);
}
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 15:18 #6
Цитата Сообщение от grelik Посмотреть сообщение
Вот полный код
size что такое? Чему равно?

Добавлено через 5 минут
C++
1
2
3
int colors = createPixelColors();
...
fprintf (pFile, "%d\n", colors[i]);
С каких пор можно индексировать целое число?
0
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 15:23  [ТС] #7
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
#define WIDTH 512
#define HEIGHT 512
#define size WIDTH*HEIGHT
uint* createPixelColors()
 
{
 
 uint *dcolors;
 
 cudaMalloc(&dcolors, size);
 
 dim3 dimBlock(16, 16);
 
 dim3 dimGrid(WIDTH/dimBlock.x, HEIGHT/dimBlock.y);
 
 mandelbrotmenge <<<dimGrid, dimBlock>>>(dcolors, 32);
 
 uint *hcolors = new uint[size];
 
 cudaMemcpy(hcolors, dcolors, size, cudaMemcpyDeviceToHost);
 
 cudaFree(dcolors);
 
 return hcolors;
 
}
 
__global__ void calc(uint image_buffer)
{
  int row = blockIdx.y * blockDim.y + threadIdx.y;  // WIDTH
  int col = blockIdx.x * blockDim.x + threadIdx.x;  // HEIGHT
  int idx = row * WIDTH + col;
  if(col >= WIDTH || row >= HEIGHT) return;
 
  float x0 = ((float)col / WIDTH) * 3.5f - 2.5f;
  float y0 = ((float)row / HEIGHT) * 3.5f - 1.75f;
 
  float x = 0.0f;
  float y = 0.0f;
  int iter = 0;
  float xtemp;
  while((x * x + y * y <= 4.0f) && (iter < MAX_ITER))
  { 
    xtemp = x * x - y * y + x0;
    y = 2.0f * x * y + y0;
    x = xtemp;
    iter++;
  }
  int color = iter * 5;
  if (color >= 256) color = 0;
  image_buffer[idx] = color;
}
 
int main(int argc, char** argv)
{
uint *colors = createPixelColors();
FILE * pFile;
   pFile = fopen ("myfile.txt","w");
   for (int i=0 ; i<size ; i++)
   {  
     fprintf (pFile, "%d\n", colors[i]);
   }
   fclose (pFile);
}
Поправил, куды нет под рукой, оттуда столько ошибок пишу по памяти, все такие хотелось бы услышать ответы поближе к вопросу из первого поста, а не придирки к синтаксису
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 16:11 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от grelik Посмотреть сообщение
а не придирки к синтаксису
Это не придирки к синтаксису, это ошибки, из-за которых нельзя решить твою проблему. Странно что ты этого не понимаешь.

Добавлено через 27 минут
Пробовал менять dim3 на dim2 в 12-й и 14-й строках?

Добавлено через 13 минут
Нашел твою проблему.
cudaMalloc принимает размер в байтах.
1
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 16:52  [ТС] #9
Спасибо!
т.е мне надо сделать вот так?:
C
1
cudaMalloc(&dcolors, sizeof(int)*size);
0
castaway
Эксперт С++
4885 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 16:55 #10
Да. Но раз уж ты работаешь с типом uint, тогда лучше так: sizeof(uint)*size.
0
05.11.2015, 16:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2015, 16:55
Привет! Вот еще темы с ответами:

Фрактал Мандельброта - Turbo Pascal
Здравствуйте!!! Помогите написать фрактал Мандельброта с заданными границами расчета -1,5 ≤ x ≤ 1,0, -0,8 ≤ y ≤0,8 на примере фрактала...

Почему не отображается фрактал Мандельброта? - OpenGL
Вот сам код, не могу понять, почему фрактал не генерируется как следует #include &lt;GL/glut.h&gt; #include &lt;cmath&gt; class Complex { ...

Как исправить исправить ошибку в коде - C#
Здравствуйте,помогите пожалуйста исправить ошибку в коде.using System; using System.Threading; namespace Gorokhov_2 { class...

Исправить ошибку в коде - C++ Builder
#include &lt;iostream.h&gt; #include &lt;math.h&gt; int main() { float a,b,c; cin &gt;&gt; a,b,c; if ((a+b&gt;c)and (a+c&gt;b) and (b+c&gt;a)) ...


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

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

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