2013-11-09 68 views
0

我在內核函數中有char類型的問題。我想分裂大char類型爲小char類型。CUDA分割字符數組

__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-使用-cuda-runtime-api)並使用'cuda-memcheck'來避開出界錯誤,就像在[CUDA標籤信息頁面]中提到的那樣(http://stackoverflow.com/tags/CUDA /信息)。 – JackOLantern

+0

@MorbidFuzzball假設BiExponent的大小爲80x100000,則該行不會超出BiExponent的結尾,如註釋中所示。我們可以同意k被for循環約束爲小於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。