سؤال

وحاولت أن تخصيص 17338896 عناصر أرقام النقطة العائمة على النحو التالي (والذي هو حوالي 70 ميغابايت):

    state = cublasAlloc(theSim->Ndim*theSim->Ndim, 
                       sizeof(*(theSim->K0)), 
                       (void**)&K0cuda);
    if(state != CUBLAS_STATUS_SUCCESS) {
        printf("Error allocation video memory.\n");
        return -1;
    }

ولكن، أتلقى رسالة خطأ CUBLAS_STATUS_ALLOC_FAILED للدولة متغيرة. هذا من شأنه أن يكون لها أي علاقة مع كمية من ذاكرة بطاقة الفيديو المتوفرة على الجهاز (128 ميغابايت على الألغام) أو أن يكون هذا الحد من مقدار الذاكرة التي يمكنني تخصيص باستخدام وظيفة cublasAlloc () (أي ليست ذات الصلة لكمية من الذاكرة المتوفرة على الجهاز)؟ حاولت استخدام وظيفة cudaMalloc () وأنا على التوالي في نفس المشكلة. شكرا مقدما على النظر في هذا.

و-------------- إضافة الاستنساخ خطأ ----------------------------- --------

#include <cuda.h>
#include <stdio.h>
int main (int argc, char *argv[]) {

    // CUDA setup
    cublasStatus state;

    if(cublasInit() == CUBLAS_STATUS_NOT_INITIALIZED) {
        printf("CUBLAS init error.\n");
        return -1;
    }

    // Instantiate video memory pointers
    float *K0cuda;

    // Allocate video memory needed
    state = cublasAlloc(20000000, 
                        sizeof(float), 
                        (void**)&K0cuda);
    if(state != CUBLAS_STATUS_SUCCESS) {
        printf("Error allocation video memory.\n");
        return -1;
    }

    // Copy K0 from CPU memory to GPU memory
    // Note: before so, decide whether to integrate as a part of InsertionSim or
    //      CUDA content as a separate class
    //state = cublasSetMatrix(theSim->Ndim, theSim->Ndim, sizeof(*theSim->K0),
    //                      theSim->K0, theSim->Ndim, K0cuda, theSim->Ndim);
    //if(state != CUBLAS_STATUS_SUCCESS) {
    //  printf("Error copy to video memory.\n");
    //  return -1;
    //}

    // Free memory
    if(cublasFree(K0cuda) != CUBLAS_STATUS_SUCCESS) {
        printf("Error freeing video memory.\n");
        return -1;
    }

    // CUDA shutdown
    if(cublasShutdown() != CUBLAS_STATUS_SUCCESS) {
        printf("CUBLAS shutdown error.\n");
        return -1;
    }

    if(theSim != NULL) delete theSim;

    return 0;
}
هل كانت مفيدة؟

المحلول

والذاكرة يمكن تجزئة، وهو ما يعني أنه ما زال بإمكانك تخصيص عدة كتل أصغر ولكنها ليست كتلة واحدة كبيرة. ومن الواضح أن بطاقة العرض المرئي الخاص بك تحتاج الى بعض الذاكرة لمهمة 2D العادية. وإذا حدث ذلك للخروج من 128 MB إلى 2 كتل من 64MB تقريبا، ثم كنت أرى هذا النوع من الفشل.

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