سؤال

أنا أعمل على القليل من التعليمات البرمجية وأحاول تحسينه قدر الإمكان ، وأعمل بشكل أساسي على تشغيله تحت حد زمني معين.

ما يلي إجراء المكالمة ...

static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);

... وما يلي هو ما تم تنفيذه.

void operator()(const blocked_range<size_t> &r) const {

    int temp;
    int i;
    int j;
    size_t k;
    size_t begin = r.begin();
    size_t end = r.end();

    for(k = begin; k != end; ++k) { // for each trainee
        temp = 0;
        for(i = 0; i < N; ++i) { // for each sample
            int trr = trRating[k][i];
            int ei = E[i];              
            for(j = 0; j < ei; ++j) { // for each expert
                temp += delta(i, trr, exRating[j][i]);
            }
        }           
        myscore[k] = temp;
    }
}

أنا أستخدم TBB من Intel لتحسين هذا. لكنني كنت أقرأ أيضًا عن SIMD و SSE2 والأشياء على طول هذه الطبيعة. لذا فإن سؤالي هو ، كيف يمكنني تخزين المتغيرات (I ، J ، K) في السجلات بحيث يمكن الوصول إليها بشكل أسرع بواسطة وحدة المعالجة المركزية؟ أعتقد أن الإجابة تتعلق بتنفيذ SSE2 أو بعض الاختلافات ، لكن ليس لدي أي فكرة عن كيفية القيام بذلك. أيه أفكار؟

تحرير: سيتم تشغيل هذا على مربع Linux ، ولكن باستخدام برنامج التحويل البرمجي Intel على ما أعتقد. إذا كان ذلك مفيدًا ، يجب أن أقوم بتشغيل الأوامر التالية قبل أن أفعل أي شيء للتأكد من أن برنامج التحويل البرمجي يعمل ... Source /opt/intel/compiler/11.1/064/bin/intel64/iccvars_intel64.csh ؛ Source /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ... ثم لمجموعة I Do: ICC -ltbb test.cxx -o test

إذا لم تكن هناك طريقة سهلة لتنفيذ SSE2 ، فلا نصيحة حول كيفية تحسين الرمز؟

شكرا ، هريستو

هل كانت مفيدة؟

المحلول

يمثل سؤالك بعض الالتباس حول ما يجري. من شبه المؤكد أن متغيرات I و J و K في السجلات بالفعل ، على افتراض أنك تقوم بتجميع التحسينات (التي يجب عليك القيام بها - إضافة "-o2" إلى احتجاج ICC الخاص بك).

يمكنك استخدام asm كتلة ، ولكن طريقة أسهل بالنظر إلى أنك تستخدم بالفعل ICC هي استخدام الجوهارات SSE. وثائق Intel بالنسبة لهم هنا - http://www.intel.com/software/products/compilers/clin/docs/ug_cpp/comm1019.htm

يبدو أنك تستطيع Simd-Exize حلقة المستوى الأعلى ، على الرغم من أنها ستعتمد بشكل كبير على ما الخاص بك delta الوظيفة هي.

نصائح أخرى

عندما تريد استخدام لغة التجميع داخل وحدة C ++ ، يمكنك وضعها داخل asm حظر ، واستمر في استخدام أسماء المتغيرات الخاصة بك من خارج الكتلة. تعليمات التجميع التي تستخدمها داخل asm سيحدد Block أي سجل وما إلى ذلك يتم تشغيله ، ولكنه سيختلف حسب النظام الأساسي.

إذا كنت تستخدم GCC ، انظر http://gcc.gnu.org/projects/tree-ssa/vectorization.html للحصول على كيفية مساعدة المترجم تلقائيًا في تحطيم الكود الخاص بك ، والأمثلة.

خلاف ذلك ، تحتاج إلى إخبارنا بالمنصة التي تستخدمها.

يجب أن يفعل المترجم هذا من أجلك. على سبيل المثال ، في VC ++ يمكنك ببساطة تشغيل SSE2.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top