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

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

Восстановить пароль Регистрация
 
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 14:21     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #1
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), помогите выяснить почему, возможности отлаживать код нету, выполнять приходится удаленно
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2015, 14:21     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA
Посмотрите здесь:

Исправить ошибку в коде C++
Исправить ошибку в коде с++ C++
C++ Исправить ошибку в коде
C++ исправить ошибку в коде
C++ Исправить ошибку в коде.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 14:38     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #2
Почему в файл пишется всегда одно значение?
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 14:40  [ТС]     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #3
Это я опечатался) Полного кода просто сейчас нет, остался на другом компе, но думаю что ошибка где то в ядре...
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 14:46     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #4
Цитата Сообщение от grelik Посмотреть сообщение
Это я опечатался) Полного кода просто сейчас нет, остался на другом компе, но думаю что ошибка где то в ядре...
Давай только гадать не будем. Будет полный код, тогда и посмотрим.
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 15:09  [ТС]     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #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);
}
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 15:18     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #6
Цитата Сообщение от grelik Посмотреть сообщение
Вот полный код
size что такое? Чему равно?

Добавлено через 5 минут
C++
1
2
3
int colors = createPixelColors();
...
fprintf (pFile, "%d\n", colors[i]);
С каких пор можно индексировать целое число?
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 15:23  [ТС]     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #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);
}
Поправил, куды нет под рукой, оттуда столько ошибок пишу по памяти, все такие хотелось бы услышать ответы поближе к вопросу из первого поста, а не придирки к синтаксису
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 16:11     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от grelik Посмотреть сообщение
а не придирки к синтаксису
Это не придирки к синтаксису, это ошибки, из-за которых нельзя решить твою проблему. Странно что ты этого не понимаешь.

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

Добавлено через 13 минут
Нашел твою проблему.
cudaMalloc принимает размер в байтах.
grelik
0 / 0 / 0
Регистрация: 22.11.2013
Сообщений: 14
05.11.2015, 16:52  [ТС]     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #9
Спасибо!
т.е мне надо сделать вот так?:
C
1
cudaMalloc(&dcolors, sizeof(int)*size);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.11.2015, 16:55     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA
Еще ссылки по теме:

исправить ошибку в коде C++
Исправить ошибку в коде C++
C++ Исправить ошибку в коде

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
05.11.2015, 16:55     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA #10
Да. Но раз уж ты работаешь с типом uint, тогда лучше так: sizeof(uint)*size.
Yandex
Объявления
05.11.2015, 16:55     Исправить ошибку в коде, рисующую фрактал Мандельброта с помощью CUDA
Ответ Создать тему
Опции темы

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