저는 C에 비교적 익숙하지 않습니다. 지금까지는 멀티 스레딩에 대한 경험이 거의 없었습니다. 숫자 배열이 소수인지 복합 요소인지를 계산하는 작은 프로그램을 작성했습니다. 이 잘 작동하지만 더 큰 숫자로 작업 할 때 스레드간에 작업 부하를 나누고 싶습니다.멀티 스레딩을 위해 소수를 어떻게 조각합니까?
일종의 생각이 들지만, C에서 이것을 구현하는 방법을 알 수 없습니다. 간단한 예로서 199라는 소수를 취하면,이 숫자를 코어 수로 나눕니다. (예 : 4) 49.75를 얻으십시오. 이 숫자를 50으로 반올림합니다. 각 스레드에 계산할 범위가 주어집니다.
첫 번째 스레드는 i2에서 50까지, 두 번째 스레드는 i51에서 102로 계산됩니다.
나는 이것이 내가 생각하는 것보다 솔루션이 더 쉽다는 것을 확신한다. 나는 그것을 해결할 수 없다.
내 코드 :
#include <pthread.h>
#include <inttypes.h>
#include <stdio.h>
#include <unistd.h>
#ifdef _SC_NPROCESSORS_ONLN
#define NUM_THREADS sysconf(_SC_NPROCESSORS_ONLN)
#else
#define NUM_THREADS 1
#endif
uint64_t numbers[] = {7,3,19,17,199,333}; // Numbers to check
void *work(void *n_void_ptr);
int isPrime(uint64_t n);
int main()
{
int rc;
pthread_t thread[NUM_THREADS];
for (int i = 0; i < sizeof(numbers)/sizeof(uint64_t); i++) {
rc = pthread_create(&thread[i], NULL, work, &numbers[i]);
}
pthread_exit(NULL);
return 0;
}
void *work(void *n_void_ptr)
{
uint64_t *n_ptr = (uint64_t *)n_void_ptr;
if (!isPrime(*n_ptr)) {
printf("%llu is a prime!\n", *n_ptr);
}
pthread_exit(NULL);
}
int isPrime(uint64_t n)
{
int count = 0;
uint64_t i; // Any number > n/2 cannot be a factor
for (i = 2; i < n/2 - 0.5; i++) {
if (n % i == 0) {
count++;
}
if (count == 1) {
printf("%llu is composite!\n", n);
return -1; // n is not prime
}
}
return 0; // n is prime
}
왜 건너 뛰는가? –
당신이 한 일은 다른 수의 병렬 검사입니다. 범위를 나누고 싶다고 생각했습니다. –
나의 실수는 위의 내용을 51로 변경 한 것입니다. 궁극적으로 범위를 분할하고 싶지만, 그렇게하는 방법에 대해서는 약간의 차이가 있습니다. –