Так что у меня происходит довольно странная ошибка. У меня есть ядро, которое должно изменить значение каждого элемента в массиве. На данный момент я тестирую только с запуском одного потока.
__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
Итак, вот что на самом деле, похоже, и происходит. Как некоторые из вас предположили, ядро действительно занимало слишком много времени и истекло время ожидания (хотя я читал из разных источников, что этого не происходит в системах 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, но это не очень помогло.
Других решений пока нет …