سؤال

عندما قمت بتقييم برنامجي، رأيت أنه في مرحلة ما أحصل على فاصل زمني يصل إلى 100 مللي ثانية.لقد بحثت في كل عملية، لكن لم تتم أي عملية على حدة هذا الوقت.ثم لاحظت أنه أينما أقوم بإجراء مكالمة cudaThreadSynchronize، فإن المكالمة الأولى تستغرق 100 مللي ثانية.ثم كتبت مثل هذا المثال أدناه.عندما يتم استدعاء cudaThreadSynchronize في السطر الأول، يتم العثور على قيمة الوقت المنقضي في النهاية أقل من 1 مللي ثانية.ولكن إذا لم يتم استدعاؤه، فسيستغرق الأمر 110 مللي ثانية في المتوسط.

int main(int argc, char **argv)
{
    cudaThreadSynchronize(); //Comment out it then get 110msec as elapsed time..

    unsigned int timer;
    cutCreateTimer(&timer);
    cutStartTimer(timer);

    float *data;
    CUDA_SAFE_CALL(cudaMalloc(&data, sizeof(float) * 1024));

    cutStopTimer(timer);
    printf("CUT Elapsed: %.3f\n", cutGetTimerValue(timer));

    cutDeleteTimer(timer);

    return EXIT_SUCCESS;
}

أعتقد أن cudaThreadSynchronize() في البداية يعالج تهيئة مكتبة CUDA.هل هي الطريقة الصحيحة لتهيئة النواة بالكامل، بحيث لا تؤثر على تقييم وقت العمليات الأخرى؟هل يكفي ويصح استدعاء cudaThreadSynchronize في البداية أم أن هناك طريقة صحيحة..

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

المحلول

من أجل استخدام CUDA، يجب أولاً إنشاء "سياق CUDA" على وحدة معالجة الرسومات، ويستغرق هذا حوالي 70-100 مللي ثانية.في المثال الخاص بك cudaThreadSynchronize(); هو صنع السياق.يتم إنشاء السياق مرة واحدة فقط لتطبيقك.عند إجراء تحليل التوقيت، أقوم أيضًا بعمل نسخة ذاكرة وهمية لإنشاء سياق (كما فعلت أعلاه باستخدام cudaThreadSynchronize();).

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