Ограничения памяти CUDA - PullRequest
       31

Ограничения памяти CUDA

0 голосов
/ 23 ноября 2011

Если я попытаюсь отправить на мое устройство CUDA структуру, размер которой превышает размер доступной памяти, выдаст ли CUDA какое-либо предупреждение или ошибку?

Я спрашиваю об этом, потому что у моего графического процессора 1024 МБ (1073414144 байт) общего объема глобальной памяти, но я не знаю, как мне справиться с этой проблемой.

Это мой код:

#define VECSIZE 2250000
#define WIDTH 1500
#define HEIGHT 1500



// Matrices are stored in row-major order:
// M(row, col) = *(M.elements + row * M.width + col)
struct Matrix
{

    int width;
    int height;
    int* elements;

};


   int main()
   {


Matrix M;
M.width = WIDTH;
M.height = HEIGHT;
M.elements = (int *) calloc(VECSIZE,sizeof(int));   

int row, col;   


// define Matrix M
// Matrix generator:
for (int i = 0; i < M.height; i++)
    for(int j = 0; j < M.width; j++)
    {
    row = i;
    col = j; 

    if (i == j)
    M.elements[row * M.width + col] = INFINITY;
        else
        {
        M.elements[row * M.width + col] = (rand() % 2); // because 'rand() % 1' just does not seems to work ta all.
        if (M.elements[row * M.width + col] == 0)  // can't have zero weight.
            M.elements[row * M.width + col] = INFINITY;
            else if (M.elements[row * M.width + col] == 2)
                M.elements[row * M.width + col] = 1;    

        }

    }





// Declare & send device Matrix to Device.
Matrix d_M;
d_M.width = M.width;
d_M.height = M.height;
size_t size = M.width * M.height * sizeof(int);
cudaMalloc(&d_M.elements, size);
cudaMemcpy(d_M.elements, M.elements, size, cudaMemcpyHostToDevice);

int *d_k=  (int*) malloc(sizeof(int));
cudaMalloc((void**) &d_k, sizeof (int));



int *d_width=(int*)malloc(sizeof(int));
cudaMalloc((void**) &d_width, sizeof(int));
unsigned int *width=(unsigned int*)malloc(sizeof(unsigned int));
width[0] = M.width;
cudaMemcpy(d_width, width, sizeof(int), cudaMemcpyHostToDevice);

int *d_height=(int*)malloc(sizeof(int));
cudaMalloc((void**) &d_height, sizeof(int));
unsigned int *height=(unsigned int*)malloc(sizeof(unsigned int));
height[0] = M.height;   
cudaMemcpy(d_height, height, sizeof(int), cudaMemcpyHostToDevice);
    /*

        et cetera .. */

Ответы [ 2 ]

6 голосов
/ 23 ноября 2011

Хотя вы, возможно, в настоящее время не отправляете достаточное количество данных на графический процессор, чтобы максимально использовать его память, при этом ваш cudaMalloc вернет код ошибки cudaErrorMemoryAllocation, который соответствует cuda api docs, сигнализирует, что выделение памяти не удалось. Я отмечаю, что в вашем примере кода вы не проверяете возвращаемые значения вызовов cuda. Эти коды возврата необходимо проверить, чтобы убедиться, что ваша программа работает правильно. Cuda api не выдает исключений: вы должны проверить коды возврата. См. эту статью для получения информации о проверке ошибок и получении значимых сообщений об ошибках

1 голос
/ 25 ноября 2011

Если вы используете cutil.h, то он предоставляет два очень полезных макроса:
CUDA_SAFE_CALL (используется при выдаче таких функций, как cudaMalloc, cudaMemcpy и т. Д.)
и
CUT_CHECK_ERROR (используется после выполнения ядра для проверки ошибок при выполнении ядра).
Они устраняют ошибки, если таковые имеются, используя механизм проверки ошибок, подробно описанный в статье, предоставленной флипчарт .

...