Преобразование простого кода C в код CUDA - PullRequest
2 голосов
/ 25 сентября 2010

Я пытаюсь преобразовать простой код числового анализа (числовая интеграция правила трапеции) во что-то, что будет работать на моем графическом процессоре с поддержкой CUDA.Существует много литературы, но все это кажется гораздо более сложным, чем требуется здесь!Мой текущий код:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define N 1000

double function(double);

int main(void)
{
   int i;
   double lower_bound, upper_bound, h, ans;

   printf("Please enter the lower and upper bounds: ");
   scanf(" %lf %lf", &lower_bound, &upper_bound);
   h = (upper - lower) / N;
   ans = (function(lower) + function(upper)) / 2.0;
   for (i = 1; i < N; ++i) {
      ans += function(i * h);
   }
   printf("The integral is: %.20lf\n", h * ans));

   return 0;
}

double function(double x)
{
   return sin(x);
}

Это работает хорошо, пока N не станет очень большим.Я сделал реализацию с openMP, которая работает быстрее, но я думаю, что будет полезно немного узнать и о CUDA.Кто-нибудь получил какие-либо предложения о том, с чего начать или есть ли безболезненный способ конвертировать этот код?Большое спасибо, Джек.

Ответы [ 3 ]

1 голос
/ 26 января 2011

Это цикл, который должен быть распределен по параллельным потокам.Вы можете рассчитать уникальный индекс для каждого потока (idx = 0 ... N-1).Каждый поток просто вычисляет свою индивидуальную часть интеграла и сохраняет ответ в своей позиции в общем массиве (intgrl [idx])Затем вы суммируете все, используя процедуру, называемую параллельным сканированием или сборкой.Есть примеры в примерах NVIDIA cuda.Самый простой способ - использовать библиотеку Thrust.Вы просто говорите ему «сложить эти значения», и он вычисляет самый быстрый метод.

0 голосов
/ 25 сентября 2010

Для начала, установите CUDA на свой компьютер.После этого попробуйте запустить некоторые примеры, доступные в SDK.На первый взгляд они могут показаться немного сложными, но не волнуйтесь, в сети существует множество примеров CUDA «Hello World».

Если вы ищете что-то более изощренное, вы можете попробовать скомпилировать этот проект (вам нужно установить OpenCV), который преобразует изображение в его представление в оттенках серого (у него есть файлы для компиляции в Windows / Linux / Mac OS X , поэтому его стоит принятьПосмотрите, нужна ли вам помощь для компиляции ваших проектов).

0 голосов
/ 25 сентября 2010

Вы могли бы избавиться от умножения: D

   double nomul = h;
   for (i = 1; i < N; ++i) {
      ans += function(nomul);
      nomul += h;
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...