2012-03-28 17 views
0

Я запрограммировал код CUDA.CUDA не работает должным образом?

unsigned long mask_buffer; 
int s; 
off_t p, 

for(p=0;p!=5000;p++) 
{ 
    for(s=start;s!=end;s++) 
    { 
     ref_off = *(((unsigned int*)(idx_base)) + p); 

     if((int)(first_indexes[s-start_sequence] % 8 - ref_off % 8) < 0) 
     { 
      int shamt2 = (ref_off % 8 - first_indexes[s-start_sequence] % 8); 
      mask_buffer = *((unsigned long *)(msk_base + (ref_off - first_indexes[s-start_sequence])/8)) >> shamt2; 

      if(((*(unsigned long *)(seqmaskc + 16 * (s-start_sequence)))^mask_buffer) << shamt2) 
       continue; 
     } 

     else if((int)(first_indexes[s-start_sequence] % 8 - ref_off % 8) == 0) 
     { 
      mask_buffer = *((unsigned long *)(msk_base + (ref_off)/8)); 

      if((*(unsigned long *)(seqmaskc + 16 * (s-start_sequence))^mask_buffer)) 
       continue; 
     } 

     else 
     { 
      int shamt2 = 8 - (first_indexes[s-start_sequence] % 8 - ref_off % 8); 
      mask_buffer = *((unsigned long *)(msk_base + (ref_off/8- first_indexes[s-start_sequence]/8) - 1)) >> shamt2; 

      if(((*(unsigned long *)(seqmaskc + 16 * (s-start_sequence)))^mask_buffer) << shamt2) 
       continue; 
     } 

     int shamt = (ref_off % 4 - first_indexes[s-start_sequence] % 4) * 2; 

     memcpy(reference_blk, ref_base + ref_off/4 - first_indexes[s-start_sequence]/4, sequence_bytes); 

     for (rp = last_rp ; rp != (unsigned long *) reference_blk ; rp--) 
     { 
      unsigned long tmp = ((*rp) & ((1 << shamt) - 1)) << (8 * sizeof(unsigned long) - shamt); 
      *rp = (*rp >> shamt) | shifted_in; 
      shifted_in = tmp; 
     } 

     *rp = (*rp >> shamt) | shifted_in; 

     if (sequence_length & 0x3) 
      reference_blk[sequence_length >> 2] &= (1 << ((sequence_length & 0x3) << 1)) - 1; 

     for (i = sequence_length >> 2 ; i & (SEQUENCE_ALIGN - 1) ; i++) 
      reference_blk[i] = 0; 

     //-- instead of memcmp --// 
     int v = 0; 
     char *p1 = (char *)sequence; 
     char *p2 = (char *)reference_blk; 
     int tmp_asd = sequence_bytes; 

     while(tmp_asd!=0) 
     { 
      v = *(p1++) - *(p2++); 

      if(v!=0) 
       break; 

      tmp_asd--; 
     } 

     if(v == 0) 
     { 
      mat_count[s - (int)start_sequence]++;  /* Maintain count */ 
      mat_position[s - (int)start_sequence] = ref_off-first_indexes[s-start_sequence]; /* Record latest position */ 
     } 

    } 
} 

Этот цикл является основной функцией моего кода. Но проблема в том, что переменная «p» никогда не увеличивается более 5 или 6. У меня есть GT530 на моем компьютере, и моя версия драйвера CUDA и версия Runtime также 4.0. Что такое проблема в этом коде ???

+0

Не могли бы вы включить полный код или, по крайней мере, часть кода с типами в нем? –

+0

Без дополнительного контекста я не думаю, что мы можем оказать очень большую помощь. Возможно ли вам вставить больше кода? –

+0

Редактировать мой код source – Jimmy

ответ

1

Предполагая, что это действительно ядро, которое, как утверждается, было вашим первоначальным сообщением перед вашим новым редактированием кода, вы не можете вызывать стандартные функции C-библиотеки, такие как memcpy внутри ядра CUDA (вы делаете это примерно на полпути через код). Вы можете только вызывать функции __device__ в ядре. Поэтому, если это не повторная реализация memcpy в CUDA, вызов этой функции внутри вашего ядра не будет работать ...

Кроме того, если вы собираетесь писать ядра CUDA, которые должны проверять результаты какие другие потоки в группе написаны, например, что вы делаете в разделе сравнения памяти вашего ядра, вам нужно будет поместить некоторые точки синхронизации в свой код, чтобы убедиться, что все потоки достигли определенного момента перед вами начните проверять результаты этих потоков. Если вы пытаетесь проверить, что другой блок мог записать в основную память, для этого также есть примитивы синхронизации, которые гарантируют, что результаты любого предыдущего блока потока были записаны в основную память.

+0

Благодарим вас за ответ. Но моя программа еще не окончательная. Поэтому я попытался запустить этот код с 1 блоком и 1 потоком, как последовательная версия. Проблема синхронизации - очень важная проблема, но более важной проблемой является проблема правильности, о которой я думаю. И я пытаюсь преобразовать memcpy в другой метод. – Jimmy

+1

Кстати, вы в Windows или Linux? Если я правильно помню, по крайней мере, в более ранних версиях CUDA, таких как 2.x, вы не можете запускать ядро ​​Windows CUDA более 5 секунд из-за тайм-аута драйвера дисплея Windows, если на карте, на которой запущено ядро ​​CUDA, также есть на нем установлен рабочий стол Windows ... поэтому, если вы работаете в одном потоке, вы можете столкнуться с этим ограничением в зависимости от размера вашей строки. – Jason

+0

Я работаю над средой Linux. Спасибо за ваш ответ – Jimmy

Смежные вопросы