2013-11-09 35 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。