В моей основной программе есть большой массив символов, который я копирую частями на устройство
объем памяти. Я запускаю около 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;
}
}