CUDA: «Переполнение стека или попадание в точку останова» и неопределенная ошибка запуска при копировании массива символов с хоста на устройство - PullRequest
0 голосов
/ 28 февраля 2012

В моей основной программе есть большой массив символов, который я копирую частями на устройство объем памяти. Я запускаю около 500 000 потоков в моей программе, и каждый поток обращается к 2000 символам. Поэтому я передаю 500 000 * 2000 = 1 ГБ байтов за раз с кодом

err = cudaMemcpy (dev_database, adjusted_database[k], JOBS * 2000 * sizeof(char), cudaMemcpyHostToDevice);
if(err != cudaSuccess) { printf("CUDA error: %s\n", cudaGetErrorString(err)); exit(EXIT_FAILURE); }

В моем ядре я также определяю три общих массива

//__shared__ char dev_query[200];
__shared__ float dev_scores[200*5];
__shared__ int dev_index[26];

и инициализируйте их

if(threadIdx.x == 0) { 
  //for(i = 0; i < 200; i++){ dev_query[i] = dev_query_constant[i]; }
  for(i = 0; i < 200 * 5; i++){ dev_scores[i] = dev_scores_constant[i]; }
  for(i = 0; i < 26; i++){ dev_index[i] = dev_index_constant[i]; }
}
__syncthreads(); 

Если я запускаю свою программу с двумя комментариями, мое ядро ​​возвращает странное значения и когда я копирую второй кусок массива символов, я получаю ошибку

Ошибка CUDA: неопределенная ошибка запуска

Если я раскомментирую строки в коде выше, все будет нормально. Если я копирую меньше куски массива, такие как 100 МБ вместо 1 ГБ, работает нормально, пока я не доберусь до 6-й кусок, где я получаю те же ошибки, что и выше.

Это очень странное поведение, и я хотел бы понять, почему это происходит. Является есть ли где-то ошибка, которая вызывает это? Трудно определить это, потому что Программа работает нормально, если я передаю небольшой кусок (например, 100 МБ) и игнорирую другой из них. Это также работает нормально, если я раскомментирую строки, связанные с общими переменными или измените общие переменные на постоянные. Любая помощь будет принята с благодарностью. Спасибо!

EDIT: Вот мое ядро. Подводя итог, я вычисляю оценку сходства двух строк, сравнивая их i-й символ для всех я между 0 и их длины. Этот код ниже выдаст вышеуказанную ошибку если вы не раскомментируете строку сразу после if(threadIdx.x == 0) {. Или если ты замените совместно используемые массивы ниже константами, тогда это также отлично работает.

__global__ void assign7(int jobs_todo, char* database, float* results, int flag) {
unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;

if(id < jobs_todo) {
__shared__ char dev_query[200];
__shared__ float dev_pos_specific_scores[200*5];
__shared__ int dev_subst_index[26];

int j_, i, p, stop, k; //stop2;
float score=0, max=0;
char ch; //ch1, ch2;

if(threadIdx.x == 0) {
//for(i = 0; i < 51; i++){ dev_query[i] = dev_query_constant[i]; }
  for(i = 0; i < 5 * 200; i++){ dev_pos_specific_scores[i] = dev_pos_specific_scores_constant[i]; }
  for(i = 0; i < 26; i++){ dev_subst_index[i] = dev_subst_index_constant[i]; }
}
__syncthreads(); 

for(i = 1; i <= 2000 - 51; i += 1){
  p = jobs_todo*(i-1);
  score = 0;
  stop = 51/1; stop = stop*1;
  for(j_ = 1; j_ <= stop; j_ += 1){
    k = (j_-1)*5;
    ch = database[p + id];
    score += dev_pos_specific_scores[k + dev_subst_index[ch - 'A']];
    if(score < 0) score = 0;
    if(score > max) max = score;                                      
    p += jobs_todo;
  }
}
results[id] = max;
}
}

Ответы [ 2 ]

2 голосов
/ 28 февраля 2012

В приведенной ниже части используется k без инициализации:

ch = database[p + id];
score += dev_scores[k + dev_index[ch - 'A']];

Это не имеет значения, но эту часть:

if(threadIdx.x == 0) { 
  //for(i = 0; i < 200; i++){ dev_query[i] = dev_query_constant[i]; }
  for(i = 0; i < 200 * 5; i++){ dev_scores[i] = dev_scores_constant[i]; }
  for(i = 0; i < 26; i++){ dev_index[i] = dev_index_constant[i]; }
}

можно изменить на что-то вроде:

if(threadIdx.x < 200) {
  // dev_query[i] = dev_query_constant[i];
}

if(threadIdx.x < 200 * 5) { // or iterate whole block 5 times..
  dev_scores[i] = dev_scores_constant[i];
}
...
0 голосов
/ 01 марта 2012

В данных было несколько символов, из-за которых dev_index[ch-'A'] вернул -1. это сделал индекс dev_scores -1, когда к = 0. Я считаю, что это был источник ошибка памяти в моем коде. Я прокомментировал все и постепенно некомментированные части. Теперь работает нормально. Спасибо @talonmies, @harrism и @perreal за ваши комментарии!

...