- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
#include <stdio.h>
#include <malloc.h>
#include <sys/time.h>
#include <pthread.h>
#define MAXPRIME 10000001
char sieve[MAXPRIME];
typedef struct {
int id, min, max, step;
unsigned long long result;
} Task;
void primes() {
printf("Searching prime numbers ...\n");
sieve[0] = sieve[1] = 1;
for (int i=2; i<MAXPRIME; i++)
sieve[i] = 0;
int i = 2;
while (1) {
while (i<MAXPRIME && sieve[i])
i++;
if (i >= MAXPRIME)
break;
for (int j=i*2; j<MAXPRIME; j+=i)
sieve[j] = 1;
i++;
}
}
double utime() {
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec + tv.tv_usec / 1000000.0;
}
unsigned long long calc(int thread, int min, int max, int step) {
unsigned long long sum = 0;
double start = utime();
int nextshow = max+1;
for (int n=max; n>=min; n-=step) {
if (!sieve[n]) {
sum += 1;
continue;
}
if (n <= nextshow && n > min) {
double elapsed = utime() - start, eta = elapsed/(max-n)*(n-min);
printf("Thread %d: current=%d elapsed=%lfs eta=%lfh\n", thread, n, elapsed, eta/3600);
nextshow = n < 10000 ? 0 : n - 10000;
}
int b;
asm("movl %1, %%ecx\n"
"1: dec %%ecx\n"
"movl %%ecx, %%eax\n"
"imull %%eax\n"
"idivl %1\n"
"cmpl %%ecx, %%edx\n"
"jnz 1b\n"
"movl %%ecx, %0"
: "=g"(b)
: "r"(n)
: "%eax", "%ecx", "%edx");
sum += b;
}
return sum;
}
void * thread(void *arg) {
Task *task = arg;
printf("Thread %d: working from %d to %d step %d\n", task->id, task->min, task->max, task->step);
task->result = calc(task->id, task->min, task->max, task->step);
printf("Thread %d: partial result is %llu\n", task->id, task->result);
return NULL;
}
int main() {
primes();
int threads = 4;
int max = 10000000;
pthread_t tid[10];
Task tasks[10];
for (int i=0; i<threads; i++) {
tasks[i].id = i;
tasks[i].min = 1;
tasks[i].max = max-i;
tasks[i].step = threads;
pthread_create(&tid[i], NULL, thread, &tasks[i]);
}
unsigned long long sum = 0;
for (int i=0; i<threads; i++) {
pthread_join(tid[i], NULL);
sum += tasks[i].result;
}
printf("Result: %llu\n", sum);
return 0;
}
ЗАВИДОВАТ
>Тут перебои с Интернетом
А, нет, отпустило.
Чем сто мегабитов интернету!
> А, нет, отпустило.
Это в основном из-за будущей жены. Она говорит, что я часто хожу на сранные сайты, например говнокод. Она считает его очень странным почему-то и говорит, чтобы я больше туда не ходил. Говорит, что у меня какая-то зависимость и что это очень плохо. Она ведь не права? Может мне её бросить?
>из-за будущей жены
100Mbps-женщина перебивает интернет.
И вообще, не нужно себя обманывать. Если ты один раз свозил девушку на Шри-Ланку на НГ, это еще не значит, что она будет тебе готовить и стирать носки. Тут без ожерелья с брелянтами не обойтись.
беги от неё!
И, вообще, мы тут привыкли к хардкору, а ты тут лезешь со своим херомуставом в нашу часть.
А король-то голый...
Не анекдот это, а реальный случай. К сожалению.
Это само собой. Оно сохраняется в куках.
Когда карма превысила порог а ссылки не работают, то нужно просто почистить куки.
Потому иногда проблемы с сессиями. Пользователя может разлогинить. Например когда карма упала ниже порога.
Да что там. Вновь прибывшим даже писать комментарии неделю нельзя. Оттуда же.
fixed
Но ссылки когда есть сессия, работают, да.
Ослик, суслик, паукан...
Голуби.
Если 64 бит. То
5 часов ждать не стал, как побыстрее оценить?)
Searching prime numbers ...
Thread 0: working from 1 to 10000000 step 4
Thread 0: current=10000000 elapsed=0.000001s eta=infh
Thread 1: working from 1 to 9999999 step 4
Thread 1: current=9999999 elapsed=0.000001s eta=infh
Thread 2: working from 1 to 9999998 step 4
Thread 2: current=9999998 elapsed=0.000001s eta=infh
Thread 3: working from 1 to 9999997 step 4
Thread 3: current=9999997 elapsed=0.000001s eta=infh
Thread 0: current=9990000 elapsed=37.571820s eta=10.426179h
Thread 2: current=9989998 elapsed=45.755806s eta=12.697232h
Thread 3: current=9989997 elapsed=47.328907s eta=13.133766h
Thread 1: current=9989999 elapsed=49.395768s eta=13.707323h
Thread 0: current=9980000 elapsed=74.303516s eta=10.299292h
Thread 2: current=9979998 elapsed=90.654717s eta=12.565747h
Thread 3: current=9979997 elapsed=95.896572s eta=13.292325h
Thread 1: current=9979999 elapsed=98.456737s eta=13.647195h
> Если 64 бит. То
Хороший код получился. Давно хотел сменить ось на 64битную. Видимо настало время.
да, срочно переходим на UTCv6, где в сутках 64 часа
(int)((((long long) b)*((long long) b))%n);
Я точно знаю что гцц правильно делает
(int)((((long long) b)*((long long) b))>>32);
так что может ты записал не так?
Эх а вот в Форте есть готовый оператор */ для такой фигни - умножить и поделить, имея промежуточный результат двойной длины.
А в Аде есть фиксированная запятая, она тут как-то должна помочь, мне кажется.
Да, конечно.
> в Форте есть готовый оператор */ для такой фигни
Да, именно такой функции и не хватает. Можно конечно ее запилить в виде макроса на асме под важные платформы, а на остальных оставить костылик с кастом в int64 перед умножением.