[英]GPU accelerated recursive function in C++
我對C ++很陌生(實際上是兩天),我想知道是否可以對這段代碼進行並行化。 我需要這要快得多,因為有數百萬次迭代。 從到目前為止的理解來看,不可能並行化,因為我使用的唯一for循環取決於之前的迭代,而不允許迭代。 對? 如果無法並行化,則如何進行優化,以使其更快。 我很驚訝,因為它的運行速度僅比原始python代碼快3倍。 (有人說C ++比python快100到400倍)
如果需要VisualStudio 2015項目文件,請告訴我。
如果運行該應用程序:您需要輸入sha1哈希,然后告訴程序基本單詞有多少個字符,例如單詞test:哈希:a94a8fe5ccb19ba61c4c0873d391e987982fbbd3長度:4
謝謝建議
#include "stdafx.h"
#include <stdio.h>
#include <string>
#include <iostream>
#include <cstring>
#include "..\crytoPP\sha.h"
#include "..\crytoPP\filters.h"
#include "..\crytoPP\hex.h"
#include "..\crytoPP\channels.h"
using namespace CryptoPP;
using namespace std;
int found = 0;
int iteration = 0;
int length;
char source[] = "abcdefghijklmnopqrstuvwxyz";
string solution = " didn't match";
string base_hash;
string CHECK(string hash, int argc, char** argv);
void COMBINATIONS(string b, int length, int source_length, int argc, char** argv);
int main(int argc, char** argv)
{
char *arr_ptr = &source[0];
int source_length = strlen(arr_ptr);
cout << "Please enter hash:";
cin >> base_hash;
cout << "Please enter length:";
cin >> length;
transform(base_hash.begin(), base_hash.end(), base_hash.begin(), ::toupper);
COMBINATIONS("", ::length, source_length, argc - 1, argv + 1);
system("PAUSE");
return 0;
}
string CHECK(string hash, int argc, char** argv) {
if (::found == 0) {
iteration++;
cout << iteration << endl;
if (argc == 2 && argv[1] != NULL)
hash = string(argv[1]);
string s1;
SHA1 sha1; SHA224 sha224; SHA256 sha256; SHA512 sha512;
HashFilter f1(sha1, new HexEncoder(new StringSink(s1)));
ChannelSwitch cs;
cs.AddDefaultRoute(f1);
StringSource ss(hash, true /*pumpAll*/, new Redirector(cs));
cout << s1 << endl;
if (s1 == ::base_hash) {
::found = 1;
cout << " =" << hash << endl;
}
return s1;
}
}
void COMBINATIONS(string b, int length, int source_length, int argc, char** argv) {
if (::found == 0) {
if (length == 0) {
CHECK(b, argc, argv);
}
else {
for (int i = 0; i < source_length; i++) {
COMBINATIONS(b + ::source[i], length -1, source_length, argc -1, argv + 1 );
CHECK(b, argc - 1, argv + 1);
}
}
}
}
您應該嘗試的第一件事是在每次迭代中都刪除輸出,因為這確實會大大降低程序的性能。
現在,您只用空字符串b
調用一次COMBINATIONS
,但是如果您要為main
每個大小為1的起始字符串b
創建一個線程,則可以有26個線程,每個線程解決問題的大小相等。 但是,最好是嘗試重寫COMBINATIONS
函數,使其更適合於並行性。
此外,您當前每次調用CHECK
時都在泄漏內存,現在看來這似乎不成問題,但是您要尋找的單詞越長,程序所需的內存就越多。 C ++要求您自己管理內存,因此至少應使用delete
用new
分配的所有內存(以確保可以重用)。 如果您嘗試重用創建的那些對象,那就更好了,因為內存分配也有些慢。
最后但並非最不重要的一點是,請重新考慮增加/減少argc
和argv
的目的。 坦白說,我在那里不太了解你的意圖,這似乎很邪惡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.