5

क्या NUMA जागरूक फैशन में सीपीपी मानक कंटेनर API का उपयोग करने का कोई सुविधाजनक और कारगर तरीका है?NUMA जागरूक सीपीपी कंटेनर

मैं एक सीपीपी पर्यावरण में एक ओपनएमपी समांतर स्पैर मैट्रिक्स वेक्टर गुणा करना चाहता हूं। आवंटित और NUMA डोमेन के संबंध में वेक्टर और मैट्रिक्स मूल्यों को प्रारंभ करने के लिए, सी कोड किसी भी तरह इस प्रकार दिखाई देगा:

size_t N = 1000000; 
double* vecVal = malloc (N*sizeof(double)); 

#pragma OMP parallel for 
for (size_i=0; i<N; ++i) 
{ 
    vecVal[i] = 0.; 
} 
/* do spMV */ 
delete vecVal; 

सीपीपी में मैं के साथ std :: वेक्टर (std :: सरणी का उपयोग करना चाहेंगे एक निश्चित आकार भी ठीक है)। क्या std :: vector :: reserve() चाल करता है? यह कुछ इस तरह करने के लिए कानूनी है:

std::vector<double> vec; 
vec.reserve(N); 
double *vecVal = vec.data(); 

#pragma OMP parallel for 
for (size_i=0; i<N; ++i) 
{ 
    vecVal[i] = 0.; 
} 
/* do spMV */ 

मैं बाद में std :: वेक्टर के लिए सही आकार सेट कर सकते हैं कैसे?

क्या कोई और अधिक सुरुचिपूर्ण तरीका जानता है?

+1

आकार बदलें() NUMA को पता नहीं है क्योंकि यह एक NUMA डोमेन (पहला स्पर्श) – Titzi

+0

पर सभी मानों को प्रारंभ करता है क्या यह NUMA जागरूक कोड के लिए 'malloc'ed स्मृति' को हटाने के लिए एक विशेष बात है? –

उत्तर

3

आपको यहां एक विशेष संख्या जागरूक आवंटक का उपयोग करना होगा। हमने एचपीएक्स के लिए इस तरह कुछ लागू किया: https://github.com/STEllAR-GROUP/hpx/blob/master/hpx/parallel/util/numa_allocator.hpp

मूल विचार यह है कि आवंटकों के अंदर पहला स्पर्श कार्य आवंटित करना है। अपने #omp parallel for schedule(static) लूप के साथ एचपीएक्स निष्पादक सामान को प्रतिस्थापित करें और आपको ठीक होना चाहिए।

संबंधित मुद्दे