그래서 소수를 찾는 프로그램을 작성하려고합니다. 이 프로젝트의 진정한 목적은 멀티 스레딩에 대해 배우는 것입니다. 처음에는 단일 스레드 프로그램을 작성했으며 1 분 만에 최대 13,633,943 개를 찾습니다. 내 멀티 스레드 버전은 10,025,627에 불과합니다.멀티 스레드가 느린 이유는 무엇입니까?
다음은 단일 스레드 프로그램
#include <iostream>
using namespace std;
bool isprime(long num)
{
long lim = num/2;
if(num == 1)
{
return 0;
}
for(long i = 2; i <= lim; i++)
{
if (num % i == 0)
{
return 0;
}
else{ lim = num/i; }
}
return 1;
}
int main()
{
long lim;
cout << "How many numbers should I test: ";
cin >> lim;
for(long i = 1; i <= lim || lim == 0; i++)
{
if(isprime(i))
{
cout << i << endl;
}
}
}
여기 내 멀티 스레드 프로그램에 대한 내 코드는 내 코드입니다.
extern"C"
{
#include <pthread.h>
#include <unistd.h>
}
#include <iostream>
using namespace std;
bool isprime(long num);
void * iter1(void * arg);
void * iter2(void * arg);
void * iter3(void * arg);
void * iter4(void * arg);
int main()
{
//long lim;
//cout << "How many numbers should I test: ";
//cin >> lim;
pthread_t t1;
char mem1[4096];//To avoid false sharing. Needed anywhere else?
pthread_t t2;
char mem2[4096];//These helped but did not solve problem.
pthread_t t3;
pthread_create(&t1, NULL, iter1, NULL);
pthread_create(&t2, NULL, iter2, NULL);
pthread_create(&t3, NULL, iter3, NULL);
iter4(0);
}
bool isprime(long num)
{
long lim = num/2;
if(num == 1)
{
return 0;
}
for(long i = 2; i <= lim; i++)
{
if (num % i == 0)
{
return 0;
}
else{ lim = num/i; }
}
return 1;
}
void * iter1(void * arg)
{
for(long i = 1;; i = i + 4)
{
if(isprime(i))
{
cout << i << endl;
}
}
return 0;
}
void * iter2(void * arg)
{
for(long i = 2;; i = i + 4)
{
if(isprime(i))
{
cout << i << endl;
}
}
return 0;
}
void * iter3(void * arg)
{
for(long i = 3;; i = i + 4)
{
if(isprime(i))
{
cout << i << endl;
}
}
return 0;
}
void * iter4(void * arg)
{
for(long i = 4;; i = i + 4)
{
if(isprime(i))
{
cout << i << endl;
}
}
return 0;
}
특히 혼란스러운 점은 시스템 모니터가 단일 스레드에 대해 25 % CPU 사용량을보고하고 다중 스레드에 대해 100 % 사용량을보고한다는 것입니다. 그것은 4 배 많은 계산을하고 있다는 것을 의미하지 않아야합니까?
은 스레드 컨텍스트 전환 시간이 늦어서 다소 느릴 수 있습니다. –
참고 : 큰 값의 경우 FYI :'lim = sqrt (num) '가 상당히 빠릅니다. –
또한 iter2와 iter4는 거의 상관이 없습니다. –