2012-03-28 51 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 */ 
     } 

    } 
} 

這個for循環是我的代碼的主要功能。 但問題是,變量「p」永遠不會增加超過5或6. 我的電腦中有GT530,我的CUDA驅動程序版本和運行時版本也是4.0。 這段代碼有什麼問題?

+0

您能否包含完整的代碼,或者至少包含代碼中包含類型的部分? – 2012-03-28 03:48:07

+0

沒有更多的上下文,我認爲我們不能提供非常多的幫助。是否有可能粘貼更多的代碼? – 2012-03-28 03:48:43

+0

編輯我的代碼源 – Jimmy 2012-03-28 04:07:02

回答

1

假設這確實是一個內核,在您的新代碼編輯宣稱它是您的原始文章之後,您不能在CUDA內核中調用標準C庫函數,如memcpy(您可以在中途執行該操作代碼)。您只能在內核中調用__device__函數。因此,除非在CUDA中重新實現memcpy,否則在內核中調用該函數將不起作用...

另外,如果您要嘗試編寫需要檢查CUDA結果的CUDA內核組中的其他線程還寫了什麼,比如你在內核的內存比較部分做了什麼,你需要在你的代碼中放置一些同步點,以確保所有線程在你之前已經達到某個點開始檢查這些線程的結果。如果您正在嘗試檢查另一個塊是否寫入了主內存,那麼也有同步原語以確保任何前一個線程塊的結果已寫入主內存。

+0

謝謝你的回答。但是,我的程序還沒有最終版本。所以我試着用1塊和1個像順序版本的線程來運行這段代碼。同步問題是非常重要的問題,但現在更重要的問題是我認爲的正確性問題。我嘗試將memcpy轉換爲另一種方法。 – Jimmy 2012-03-28 04:38:36

+1

順便說一句,你在Windows或Linux?如果我沒有記錯,至少在早期版本的CUDA上,如2.x,如果您正在運行CUDA內核的卡也會由於Windows顯示驅動程序超時而無法運行Windows CUDA內核超過5秒有Windows桌面擴展到它...所以如果你在一個線程上運行,那麼你可能會跑到這個限制取決於你的字符串的大小。 – Jason 2012-03-28 04:46:55

+0

我正在研究Linux環境。謝謝您的回答 – Jimmy 2012-03-28 04:53:36