2011-02-23 72 views
1

所以我在一個基本的高中編碼類。我們不得不想出一個 我們的學期項目。我選擇了 基於我的想法和應用 沒有用於傳統的代碼。 這提出了使用CUDA 的想法。我會 知道比較傳統 方法與非常規方法的最佳方法之一是 字符串生成和比較。其中一個 可以演示傳統CPU 與定時器和輸出的匹配速度和 。和 然後你可以顯示GPU 處理速度和輸出的增加(或減少 )。C++到Cuda轉換/字符串生成和比較

我編寫了這個C++代碼來生成隨機字符,這些隨機字符被輸入到 字符數組中,然後將該數組匹配到預定字符串。然而像大多數CPU編程那樣, 相對於 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 = "[email protected]"; 
static const char alphanum[] = 
"" 
"[email protected]#$%^&*" 
"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

如果要實現使用CUDA僞隨機數生成器,看看over here。如果您想從預定的字符集中生成char,您可以將所有可能的char s放入該數組中,並創建一個隨機索引(就像您現在正在做的那樣)。

但我認爲這可能是更有價值的比較可能是一個使用暴力。因此,您可以調整程序以嘗試不隨機的字符串,但可以按任何有意義的順序嘗試一個接一個的字符串。

然後,另一方面,您可以使用CUDA在GPU上實現蠻力的東西。這可能會很棘手,因爲您可能想盡快停止全部 CUDA線程其中之一找到解決方案。我可以想象使用CUDA的蠻力程序如下:一個線程嘗試aa作爲前兩個字母,並蠻力所有後續數字,下一個線程嘗試ab作爲前兩個字母,並蠻力所有後續數字,下一個線程嘗試作爲前兩個字母和蠻力的所有後面的數字,以此類推。所有這些線程並行運行。當然,你可以改變預定的數量,例如,第一個線程嘗試aaaa,第二個線程aaab。然後,您可以比較不同的輸入值。如果您從未處理過CUDA,我推薦使用vector addition sample這個非常基本的CUDA示例,它非常適合用於基本理解CUDA正在發生的變化。此外,您應該閱讀CUDA programming guide以使您熟悉包含線程網格的線程塊網格的CUDA概念。一旦你理解了這一點,我認爲CUDA組織的東西變得更加清晰。簡而言之,在CUDA中,您應該用一個內核替換循環,並且一次執行多次。

+0

這似乎是我正在尋找。我的印象是,這基本上是一種強力方法,但在不同的實施情況下。任何想法如何我可以更好地執行這個代碼來實現真正的BF methodoloy? – Cistoran 2011-02-23 17:47:44

0

首先,我不確定你的實際問題是什麼?你需要一個更快的隨機數發生器還是更長的週期?在這種情況下,我會建議boost::random,「梅森扭轉者」通常被認爲是最先進的。開始有點困難,但是提升是一個很棒的圖書館,所以值得努力。

我認爲你使用的方法應該相當有效。請注意,它可能需要(#字符)^(字符串的長度)才能到達目標字符串(這裏是70^4 = 24010000)。由於這個過程是蒙特卡洛模擬並且可以並行化,因此GPU應該處於優勢地位。

您是否使用優化編譯了代碼?

+0

我的問題是詢問CUDA中的一個隨機生成器,我可以使用它來轉換爲字符以與字符串進行比較。 – Cistoran 2011-02-23 17:39:35