私はC++で書いた素数ジェネレーターのマルチスレッド化について研究しようとしてきましたが、私がやりたいことは「並列処理」と呼ばれていることを発見しました。私は過去約45分間これを研究してきましたが、私はそれを理解できないようです。
これを実行したいコードは約95行で、ここに投稿するには長すぎますが、これが基本的な概念です。
unsigned long long i, total;
for(i;true;i++){
total = total + i;
cout << "Your new total is " << total << endl;
}
これを2つのプロセッサにストリーミングして、競合するのではなく連携させる方法はありますか?もしそうなら、私はそれをどのようにコーディングしますか?私はC++にある程度精通していますが、まだわからないことがたくさんあるので、詳細な回答をいただければ幸いです。
編集:最初は間違った種類のアルゴリズム。これだと思います。
編集2:多くの答えが私のアルゴリズムに依存すると言っているので、95行しかないのでコードを投稿します。
/*Generic GPL stuff, coded by me */
#include <iostream>
#include <list>
#include <fstream>
using namespace std;
int main(){
//Declare some variables and what not.
unsigned long long count = 0, misc = 0, length = 0, limit = 0;
list <long long> primes;
ifstream inFile;
ofstream outFile;
cout << "Initializing starting values based on your existing file of generated prime numbers.\n";
//Now let's get our starting values;
inFile.open("/home/user/Desktop/primes.txt");
//First, we need to find the prime generator thus far
for(unsigned long long x=0;inFile.good();x++){
inFile >> count;
if(!(bool)(x%100000000) && x!=0){
misc = x/100000000;
cout << misc << "00000000 primes read so far...\n";
}
}
inFile.close();
cout << "Highest generated prime found.\n";
//Now, as much as I hate to say it, we need to parse part of the file again now that we have the largest prime.
inFile.open("/media/ssd/primes_src.txt");
for(length; limit < count; length++){
inFile >> misc;
}
inFile.close();
limit = misc * misc;
cout << "Initialization complete. Now generating primes.\n";
//Loop time
l:
//We're just going to flat-out skip even numbers
count++;
count++;
//This checks to see if the number it's trying to test is beyond the current limit of accuracy.
if(count >= limit){
// Now if we are, we have 1 more possible prime factor
length++;
inFile.open("/media/ssd/primes_src.txt");
for(unsigned long long x=0; x < length; x++){
inFile >> misc;
}
inFile.close();
limit = misc * misc;
}
inFile.open("/media/ssd/primes_src.txt");
inFile >> misc; //We don't care about 2
for(unsigned long long x=1; x < length; x++){
inFile >> misc;
if(!(bool)(count%misc)){
inFile.close();
goto l;
}
}
inFile.close();
outFile.open("/home/user/Desktop/primes.txt", ios::out | ios::app);
//Now if we haven't been "goto"d, we add it to the file.
outFile << count << endl;
outFile.close();
goto l;
return 0;
}
/home/user/Desktop/primes.txtは、生成されたすべての素数を保持する私のファイルです。
/media/ssd/primes_src.txtは、2^32までのすべての素数と1つの素数を適切に保持するファイルです。