سؤال

لدى شركتي إعداد من اثنين من GTX 295 ، وبالتالي ما مجموعه 4 وحدات معالجة الرسومات في الخادم ، ولدينا العديد من الخوادم. لقد كان GPU 1 على وجه التحديد بطيئًا ، بالمقارنة مع GPU 0 و 2 و 3 لذلك كتبت اختبار السرعة القليل للمساعدة في العثور على سبب المشكلة.

//#include <stdio.h>
//#include <stdlib.h>
//#include <cuda_runtime.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cutil.h>

__global__ void test_kernel(float *d_data) {
    int tid = blockDim.x*blockIdx.x + threadIdx.x;
    for (int i=0;i<10000;++i) {
        d_data[tid] = float(i*2.2);
        d_data[tid] += 3.3;
    }
}

int main(int argc, char* argv[])
{

    int deviceCount;                                                         
    cudaGetDeviceCount(&deviceCount);
    int device = 0; //SELECT GPU HERE
    cudaSetDevice(device);


    cudaEvent_t start, stop;
    unsigned int num_vals = 200000000;
    float *h_data = new float[num_vals];
    for (int i=0;i<num_vals;++i) {
        h_data[i] = float(i);
    }

    float *d_data = NULL;
    float malloc_timer;
    cudaEventCreate(&start);
    cudaEventCreate(&stop); cudaEventRecord( start, 0 );
    cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
    cudaMalloc((void**)&d_data, sizeof(float)*num_vals);
    cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &malloc_timer, start, stop );
    cudaEventDestroy( start );
    cudaEventDestroy( stop );


    float mem_timer;
    cudaEventCreate(&start);
    cudaEventCreate(&stop); cudaEventRecord( start, 0 );
    cudaMemcpy(d_data, h_data, sizeof(float)*num_vals,cudaMemcpyHostToDevice);
    cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &mem_timer, start, stop );
    cudaEventDestroy( start );
    cudaEventDestroy( stop );

    float kernel_timer;
    cudaEventCreate(&start);
    cudaEventCreate(&stop); cudaEventRecord( start, 0 );
    test_kernel<<<1000,256>>>(d_data);
    cudaEventRecord( stop, 0 ); cudaEventSynchronize( stop ); cudaEventElapsedTime( &kernel_timer, start, stop );
    cudaEventDestroy( start );
    cudaEventDestroy( stop );

    printf("cudaMalloc took %f ms\n",malloc_timer);
    printf("Copy to the GPU took %f ms\n",mem_timer);
    printf("Test Kernel took %f ms\n",kernel_timer);

    cudaMemcpy(h_data,d_data, sizeof(float)*num_vals,cudaMemcpyDeviceToHost);

    delete[] h_data;
    return 0;
}

النتائج

GPU0 CUDAMALLOC استغرق 0.908640 مللي ثانية إلى GPU استغرق 296.058777 MS اختبار kernel 326.721283 MS

استغرق GPU1 Cudamalloc نسخ 0.913568 مللي ثانية إلى وحدة معالجة الرسومات 663.182251 مللي ثانيةاستغرق اختبار kernel 326.710785 مللي ثانية

GPU2 CUDAMALLOC استغرق 0.925600 مللي ثانية إلى GPU استغرق 296.915039 MS اختبار kernel 327.127930 مللي ثانية

GPU3 CUDAMALLOC استغرق 0.920416 مللي ثانية إلى GPU استغرق 296.968384 MS استغرق kernel 327.038696 مللي ثانية

كما ترون ، فإن cudamemcpy إلى وحدة معالجة الرسومات هو ضعف مقدار الوقت لـ GPU1. هذا متسق بين جميع خوادمنا ، هو دائما GPU1 البطيء. أي أفكار لماذا هذا قد يكون؟ تعمل جميع الخوادم على تشغيل Windows XP.

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

المحلول

كانت هذه قضية سائق. تحديث إلى أحدث برنامج تشغيل إصلاحه

نصائح أخرى

قد تكون هذه مشكلة في ناقل PCI الخاص بك ، حاول تبديل البطاقات في فتحات مختلفة لمعرفة ما إذا كانت المشكلة مستمرة. إذا كانت هذه مشكلة ، فقم بنسخ جميع بياناتك إلى GTX295 عبر فتحة أسرع واستخدم SLI Top Copy عبر وحدة معالجة الرسومات الأخرى (Blow PCI Bus).

إذا كان بإمكانك استخدام GDDR لبطاقة الفيديو الأسرع لتحميلها ، فيمكنك القيام بجهاز TANSFER على نطاق ترددي أعلى بكثير ، مما قد يساعد في التخلص من المشكلة أيضًا. أيضًا ، تحقق من عرض النطاق الترددي الخاص بك مع اختبار النطاق الترددي لـ NVIDIA للحصول على بعض النتائج المادية واختبارها.

حظا طيبا وفقك الله!

هل تعمل في إعداد معالج مزدوج؟ هناك خطأ في شرائح Tylersburg الحالية بحيث يكون عرض النطاق الترددي للمسار x86 (0) إلى GPU (1) أبطأ من المسار المباشر من x86 (0) إلى GPU (0). يجب على Intel إصدار نسخة جديدة لإصلاح هذا الخطأ. حاول قفل عملية الاختبار الخاصة بك إلى وحدة المعالجة المركزية المحددة باستخدام TASKSET ومعرفة النتائج التي تحصل عليها.

تحيات مارك

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