我有一个CUDA内核,我正在编译成一个没有任何特殊标记的Cubin文件:
nvcc text.cu -cubin它编译,虽然有这个消息:
Advisory: Cannot tell what pointer points to, assuming global memory space以及对某个临时cpp文件中的一行的引用。我可以通过评论一些看似任意的代码,这对我来说毫无意义。 内核如下:
__global__ void string_search(char** texts, int* lengths, char* symbol, int* matches, int symbolLength) { int localMatches = 0; int blockId = blockIdx.x + blockIdx.y * gridDim.x; int threadId = threadIdx.x + threadIdx.y * blockDim.x; int blockThreads = blockDim.x * blockDim.y; __shared__ int localMatchCounts[32]; bool breaking = false; for(int i = 0; i < (lengths[blockId] - (symbolLength - 1)); i += blockThreads) { if(texts[blockId][i] == symbol[0]) { for(int j = 1; j < symbolLength; j++) { if(texts[blockId][i + j] != symbol[j]) { breaking = true; break; } } if (breaking) continue; localMatches++; } } localMatchCounts[threadId] = localMatches; __syncthreads(); if(threadId == 0) { int sum = 0; for(int i = 0; i < 32; i++) { sum += localMatchCounts[i]; } matches[blockId] = sum; } }如果我更换线路
localMatchCounts[threadId] = localMatches;在第一个for循环之后
localMatchCounts[threadId] = 5;它编译没有通知。这也可以通过注释上面循环的看似随机的部分来实现。我也尝试用正常的数组替换本地存储器阵列,但没有任何效果。谁能告诉我问题是什么? 该系统是Vista 64位,为它的价值。 编辑:我修正了代码,所以它实际上工作,虽然它仍然产生编译器通知。看起来好像这个警告是一个问题,至少在正确性方面(它可能会影响性能)。
没有找到相关结果
已邀请:
2 个回复
jquia
赞同来自:
这个问题似乎与char *参数有关。把它变成char 解决了警告,所以我怀疑cuda可能在这种形式的数据上有问题。也许cuda更喜欢在这种情况下使用特定的cuda 2D阵列。
jalias
赞同来自:
像char *这样的指针数组在内核中存在问题,因为内核无法访问主机的内存。
在内核中:最好分配一个连续缓冲区 B>,并将其划分为能够并行访问的方式。
在这种情况下,我将定义一个1D数组,其中包含所有依次定位的字符串和另一个1D数组,其大小为2 numberOfStrings,其中包含每个字符串在第一个数组内的偏移量,长度为:
例如 - 准备内核: