Преобразование C ++ в Cuda / генерация и сравнение строк - PullRequest
1 голос
/ 23 февраля 2011

Итак, я учусь в базовом классе по программированию.Нам пришлось придумать один из наших семестровых проектов.Я решил основывать свои идеи и приложения, которые не используются в традиционном коде.Это породило идею использования CUDA.Один из лучших способов сравнить скорость традиционных методов с нетрадиционными - генерация и сравнение строк.Можно продемонстрировать скорость генерации и сопоставления традиционной генерации процессора с таймерами и выходными данными.И затем вы можете показать увеличение (или уменьшение) скорости и производительности обработки графическим процессором.

Я написал этот код C ++ для генерации случайных символов, которые вводятся в массив символов, а затем сопоставляют этот массив с заранее определенной строкой.,Однако, как и в большинстве процессорных программ, он невероятно медленный по сравнению с программированием на GPU.Я просмотрел CUDA API и не смог найти что-то, что могло бы направить меня в правильном направлении для того, что я хочу сделать.

Ниже приведен код, написанный на C ++, если кто-то может указатьмне в направлении таких вещей, как генератор случайных чисел, которые я могу преобразовать в символы с помощью кодов ASCII, это было бы отлично.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

int sLength = 0;
int count = 0;
int stop = 0;
int maxValue = 0;
string inString = "aB1@";
static const char alphanum[] =
"0123456789"
"!@#$%^&*"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";

int stringLength = sizeof(alphanum) - 1;

char genRandom()
{
    return alphanum[rand() % stringLength];
}

int main()
{
    cout << "Length of string to match?" << endl;
    cin >> sLength;
    string sMatch(sLength, ' ');
    while(true)
    {
        for (int x = 0; x < sLength; x++)
        {
            sMatch[x] = genRandom();
            //cout << sMatch[x];
            count++;
            if (count == 2147000000)
            {
                count == 0;
                maxValue++;
            }
        }
        if (sMatch == inString)
        {
            cout << "It took " << count + (maxValue*2147000000) << " randomly generated characters to match the strings." << endl;
            cin >> stop;
        }
        //cout << endl;
    }

}

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Если вы хотите реализовать генератор псевдослучайных чисел с использованием CUDA, посмотрите здесь .Если вы хотите сгенерировать char s из заранее определенного набора символов, вы можете просто поместить все возможные char s в этот массив и создать случайный индекс (как вы это делаете прямо сейчас).

Но я думаю, что это может быть более ценным сравнением, которое использует грубую силу.Следовательно, вы можете адаптировать свою программу, чтобы она пробовала не случайные строки, а пробовала одну строку за другой в любом значимом порядке.

Затем, с другой стороны, вы могли бы реализовать грубую силу на GPU, используя CUDA,Это может быть сложно, так как вы можете остановить все потоки CUDA, как только один из них найдет решение.Я мог бы представить процесс грубой силы с использованием CUDA следующим образом: один поток пытается aa в качестве первых двух букв и грубой силы все следующие цифры, следующий поток пытается ab в качестве первых двух букв и грубой силы все следующие цифры,следующий поток пытается ac в качестве первых двух букв и грубой силы всех последующих цифр и так далее.Все эти потоки работают параллельно.Конечно, вы можете изменить количество предопределенных char с таким, что, например, первый поток пытается aaaa, второй aaab.Затем вы можете сравнить различные входные значения.

В любом случае, если вы никогда не имели дело с CUDA, я рекомендую пример сложения векторов , очень простой пример CUDA, который очень хорошо подходит дляполучить общее представление о том, что происходит с CUDA.Кроме того, вы должны прочитать Руководство по программированию CUDA , чтобы ознакомиться с концепцией CUDA для сетки потоковых блоков, содержащих сетку потоков.Как только вы поймете это, я думаю, станет понятнее, как CUDA организовывает вещи.Короче говоря, в CUDA вы должны заменить циклы ядром, которое выполняется несколько раз одновременно.

0 голосов
/ 23 февраля 2011

Во-первых, я не уверен, каков ваш настоящий вопрос? Вам нужен более быстрый генератор случайных чисел или генератор с большим периодом? В этом случае я бы порекомендовал boost :: random , «Mersenne Twister» обычно считается современным. Начать немного сложно, но boost - отличная библиотека, поэтому стоит потраченных усилий.

Я думаю, что метод, который вы используете, должен быть довольно эффективным. Имейте в виду, что для получения целевой строки может потребоваться до (#characters) ^ (длина строки) (здесь 70 ^ 4 = 24010000). Здесь у GPU должно быть преимущество, поскольку этот процесс является симуляцией Монте-Карло и тривиально распараллеливаем.

Вы скомпилировали код с оптимизацией?

...