से धीमा है निम्न प्रोग्राम अनिवार्य रूप से here वर्णित जैसा ही है। जब मैं चलाने के लिए और दो धागे (NTHREADS == 2), मैं निम्नलिखित रन बार का उपयोग कर कार्यक्रम संकलन:मल्टी-थ्रेडेड random_r एकल थ्रेडेड संस्करण
real 0m14.120s
user 0m25.570s
sys 0m0.050s
जब यह सिर्फ एक धागा (NTHREADS == 1), मैं चलाने हो समय के साथ चलाया जाता है काफी बेहतर है, भले ही यह केवल एक कोर का उपयोग कर रहा हो।
real 0m4.705s
user 0m4.660s
sys 0m0.010s
मेरे प्रणाली डुअल कोर है, और मुझे पता random_r धागा सुरक्षित है और मैं बहुत यकीन है कि यह गैर अवरुद्ध है हूँ। जब एक ही प्रोग्राम random_r के बिना चलाया जाता है और कोसाइन और साइनों की गणना प्रतिस्थापन के रूप में उपयोग की जाती है, तो दोहरी-थ्रेडेड संस्करण अपेक्षाकृत लगभग 1/2 बार चलता है।
#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);
}
मैं उलझन में हूँ कारण है कि जब यादृच्छिक संख्या पैदा करने दो थ्रेडेड संस्करण एकल थ्रेड संस्करण की तुलना में बहुत खराब प्रदर्शन करने वाला, पर विचार random_r मल्टी-थ्रेडेड अनुप्रयोगों में किया जा करने के लिए है। अंतरिक्ष के लिए
उह। यह किसी भी छोटी, घनी संरचना को बहुत अधिक काट सकता है कि कई धागे भागों के लिए लिखने की कोशिश कर रहे हैं, है ना? –
आपकी मदद के लिए धन्यवाद दस लाख, मैं इसे अपने आप कभी नहीं समझूंगा। Ps। मैंने rand_states और rand_statebufs को थ्रेड में ले जाया और वहां से यादृच्छिक संख्या जेनरेटर शुरू किया। जो कैश की समस्या को बहुत सरल तरीके से अच्छी तरह से हल करता है। – Nixuz
@ निकोलस: हाँ। यह स्मृति के साथ अधिक मतलब नहीं होने का भुगतान करता है। आपको याद है, आपके धागे-स्थानीय आवंटन को पैक करना भी मदद कर सकता है। जब आप इतने सारे कैश विवाद और लॉकिंग से बच सकते हैं तो थ्रेड-लोकल एक शानदार जीत हो सकती है। –