다음 프로그램은 본질적으로 here과 동일합니다. 나는 실행하고 두 개의 스레드 (NTHREADS == 2), 내가 얻을 다음과 같은 런타임을 사용하여 프로그램을 컴파일 할 때 :다중 스레드 random_r이 단일 스레드 버전보다 느림
real 0m14.120s
user 0m25.570s
sys 0m0.050s
그것은 단지 하나의 스레드 (NTHREADS == 1), I 실행 얻을 시대와 함께 실행하면 하나의 코어 만 사용하더라도 훨씬 더 좋습니다.
real 0m4.705s
user 0m4.660s
sys 0m0.010s
내 시스템은 듀얼 코어이며, 나는 random_r 스레드 안전 알고 나는 비 차단 확신합니다. random_r없이 동일한 프로그램을 실행하고 코사인 및 사인 계산을 대체로 사용하면 이중 스레드 버전이 예상 된 시간의 약 1/2에서 실행됩니다. 임의의 숫자를 생성 할 때 두 개의 스레드 버전 random_r은 멀티 스레드 애플리케이션에 사용하기위한 것입니다 고려하여 단일 스레드 버전보다 훨씬 더 수행하는 이유
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#define NTHREADS 2
#define PRNG_BUFSZ 8
#define ITERATIONS 1000000000
void* thread_run(void* arg) {
int r1, i, totalIterations = ITERATIONS/NTHREADS;
for (i = 0; i < totalIterations; i++){
random_r((struct random_data*)arg, &r1);
}
printf("%i\n", r1);
}
int main(int argc, char** argv) {
struct random_data* rand_states = (struct random_data*)calloc(NTHREADS, sizeof(struct random_data));
char* rand_statebufs = (char*)calloc(NTHREADS, PRNG_BUFSZ);
pthread_t* thread_ids;
int t = 0;
thread_ids = (pthread_t*)calloc(NTHREADS, sizeof(pthread_t));
/* create threads */
for (t = 0; t < NTHREADS; t++) {
initstate_r(random(), &rand_statebufs[t], PRNG_BUFSZ, &rand_states[t]);
pthread_create(&thread_ids[t], NULL, &thread_run, &rand_states[t]);
}
for (t = 0; t < NTHREADS; t++) {
pthread_join(thread_ids[t], NULL);
}
free(thread_ids);
free(rand_states);
free(rand_statebufs);
}
나는 혼란 스러워요. 공간
어. 이것은 많은 스레드가 여러 부분에 쓰려고 시도하는 작거나 밀집된 구조를 거의 무시할 수 있습니까? –
도움을 주신 것에 감사드립니다. 혼자 힘으로는 알지 못했을 것입니다. Ps. rand_states와 rand_statebufs를 스레드로 옮긴 다음 거기에서 난수 생성기를 초기화했습니다. 또한 캐시 문제를 매우 간단하게 해결합니다. – Nixuz
@Nicholas : 네. 그것은 메모리를 지나치게 의미하지 않는 것이 좋습니다. 스레드 로컬 할당을 함께 포장하면 도움이 될 것입니다. 너무 많은 캐시 경합과 잠금을 피할 수 있기 때문에 스레드 로컬라이제이션은 엄청난 승리가 될 수 있습니다. –