2013-11-09 4 views
0

У меня проблема с char type в функции ядра. Я хочу разделить большой тип char на маленький тип char.CUDA split char array

__global__ void kernelExponentLoad(char* BiExponent,int lines){ 
    // BiExponent is formed from 80x100000 numbers 
     const int numThreads = blockDim.x * gridDim.x; 
     const int threadID = blockIdx.x * blockDim.x + threadIdx.x; 
     for (int k = threadID; k < 100000; k += numThreads){ 
      char* cstr = new char[80]; 
      for(int i=0; i<80; i++){  
      cstr[i] = BiExponent[(k*80)+i]; 
      ... 
      delete[] cstr; 
      } 
     } 
    } 

Это мое решение не работает - сбой ядра (прекращение работы) после запуска. Данные в «char * BiExponent» в порядке (функция printf работает нормально).

+1

Вы не указали достаточно информации о своем коде. Вы должны опубликовать полностью компилируемый и исполняемый код, чтобы люди, желающие помочь вам, могли запускать и проверять его. До этого вы можете начать тестирование кода самостоятельно, добавив [проверка ошибок] (http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors- using-the-cuda-runtime-api) и используя 'cuda-memcheck', чтобы избежать ненужных ошибок, как упоминалось также на странице [CUDA tag info] (http://stackoverflow.com/tags/CUDA/данные). – JackOLantern

+0

@MorbidFuzzball эта строка не будет читаться за пределами BiExponent, предполагая, что BiExponent имеет размер 80x100000, как указано в комментариях. Мы можем согласиться с тем, что k ограничено значением менее 100000 для цикла, верно? Тогда 80 * 99999 + 79 меньше 80x100000. Это не зависит от количества запущенных потоков, за исключением того, что количество запущенных потоков должно быть меньше 100 000. –

ответ

2

То, как ваше ядро ​​написано в этом вопросе, ваш оператор delete неправильно расположен.

Вы выполняете оператор delete на каждом своем проходе в вашей внутренней линии. Это неверно. Возможно, вы хотите его позиционируется, как это:

__global__ void kernelExponentLoad(char* BiExponent,int lines){ 
// BiExponent is formed from 80x100000 numbers 
    const int numThreads = blockDim.x * gridDim.x; 
    const int threadID = blockIdx.x * blockDim.x + threadIdx.x; 
    for (int k = threadID; k < 100000; k += numThreads){ 
     char* cstr = new char[80]; 
     for(int i=0; i<80; i++){  
      cstr[i] = BiExponent[(k*80)+i]; 
      } 
     ... 
     delete[] cstr; 
    } 
} 

Обратите внимание, что есть два близких брекеты после delete и один до, а не все 3 после, как вы показали.