Ошибка CUDA при обработке большого ввода

Так что у меня происходит довольно странная ошибка. У меня есть ядро, которое должно изменить значение каждого элемента в массиве. На данный момент я тестирую только с запуском одного потока.

    __global__ void kernel(int* data) {
for (int var = 0; var < SIZE; ++var) {
data[var] = data[var] + 1;
}
}

Вот весь код:

    #include "stdint.h"#include "stdio.h"#include "kernelLauncher.cuh"#include <cuda_runtime.h>

#define  SIZE 10485760

typedef uint64_t POLY_64;
typedef unsigned char BYTE;__global__ void kernel(int* data) {

for (int var = 0; var < SIZE; ++var) {
data[var] = data[var] + 1;
}

}

int main() {

int* data = (int*) malloc(sizeof(int) * SIZE);
int* data_d;

for (int var = 0; var < SIZE; ++var) {
data[var] = 1;
}
//allocate device memory for the fingerprinting data
cudaMalloc((void**) &data_d, sizeof(int) * SIZE);

//copy the data to device

CUDA_CHECK_RETURN(
cudaMemcpy(data_d, data, sizeof(int) * SIZE, cudaMemcpyHostToDevice));

kernel<<<1, 1>>>(data_d);
cudaThreadSynchronize();CUDA_CHECK_RETURN(cudaMemcpy(data, data_d, sizeof(int) * SIZE, cudaMemcpyDeviceToHost));

//try to print the result
for (int var = 0; var < SIZE; ++var) {
printf("%d\n", data[var]);
}

CUDA_CHECK_RETURN(cudaFree(data_d));
return 0;
}

Когда мой размер определен как 1048576, я получаю свои данные обратно очень хорошо. К сожалению, когда я определяю его как 10485760 (в 10 раз больше). Я получил:

    Error unspecified launch failure at line 40 in file ../src/runTest.cu

Может кто-нибудь указать мне в правильном направлении. Почему эта проблема происходит? заранее спасибо

РЕДАКТИРОВАТЬ: Так что да .. это определение размера. Я изменил свой код сейчас, чтобы не было расхождений между жестко закодированным значением цикла в ядре и определенной константой. Тем не менее, если у меня есть 10485760 вместо 1048576, он просто не работает .. Почему это так. Это не слишком большое выделение за один раз. Моя карта — Quadro FX 770m с возможностью вычислений 1.1

0

Решение

Итак, вот что на самом деле, похоже, и происходит. Как некоторые из вас предположили, ядро ​​действительно занимало слишком много времени и истекло время ожидания (хотя я читал из разных источников, что этого не происходит в системах Linux). Таким образом, разделение такой работы фактически решает проблему и избегает сторожевого таймера, убивающего ядро. :

        kernel<<<1, 1>>>(data_d, 0, 1048576);
cudaDeviceSynchronize();
kernel<<<1, 1>>>(data_d, 1048576, 2097152);
cudaDeviceSynchronize();
kernel<<<1, 1>>>(data_d, 2097152, 3145728);
cudaDeviceSynchronize();
kernel<<<1, 1>>>(data_d, 3145728, 4194304);
cudaDeviceSynchronize();
kernel<<<1, 1>>>(data_d, 4194304, 5242880);
cudaDeviceSynchronize();
kernel<<<1, 1>>>(data_d, 5242880, 6291456);
cudaDeviceSynchronize();
kernel<<<1, 1>>>(data_d, 6291456, 7340032);
cudaDeviceSynchronize();
kernel<<<1, 1>>>(data_d, 7340032, 8388608);
cudaDeviceSynchronize();

Теперь мне интересно, как избежать этого порога. Я пытался добавить

    Section "Device"Identifier     "Device0"Driver         "nvidia"VendorName     "NVIDIA Corporation"Option         "Interactive" "0"  #<<--- added to avoid kernel time-out
EndSection

в разделе устройства в моем Xorg.conf, но это не очень помогло.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]