是否有一种简单的方法(谷歌未提供...)从单个输入数组中分配每块共享内存区域,以便可以有重叠?CUDA:具有重叠边框的共享内存分配
简单的例子是字符串搜索;看到我想骰子输入文本,让每个块中的每个线程搜索从文本[thread_id]开始的模式,但希望分配给每个块的数据重叠模式长度,以便跨越边界的匹配案例是仍然找到。
即分配给共享内存每个块的总内存大小为
(blocksize+patternlength)*sizeof(char)
我可能失去了一些东西简单,通过CUDA引导我目前跳水,但希望一些指导。
更新:我怀疑有些人误解了我的问题(或者我误解了它)。
说我有一个数据集QWERTYUIOP,我想搜索一个3个字符的匹配,并且我将每个线程块的数据集(任意地)分成4个; QWER TYUI OPxx
这很简单,但如果3个字符匹配实际上是在寻找IOP,算法会失败。
在这种情况下,我想是每个块的共享内存有:
QWERTY TYUIOP OPxxxx
即每块被分配块大小+ patternlength-1的字符发生这样没有内存边界问题。
希望能够更好地解释事物。
由于@jmilloy正在执着...:P不是
//VERSION 1: Simple
__global__ void gpuSearchSimple(char *T, int lenT, char *P, int lenP, int *pFound)
{
int startIndex = blockDim.x*blockIdx.x + threadIdx.x;
int fMatch = 1;
for (int i=0; i < lenP; i++)
{
if (T[startIndex+i] != P[i]) fMatch = 0;
}
if (fMatch) atomicMin(pFound, startIndex);
}
//VERSION 2: Texture
__global__ void gpuSearchTexture(int lenT, int lenP, int *pFound)
{
int startIndex = blockDim.x*blockIdx.x + threadIdx.x;
int fMatch = 1;
for (int i=0; i < lenP; i++)
{
if (tex1Dfetch(texT,startIndex+i) != tex1Dfetch(texP,i)) fMatch = 0;
}
if (fMatch) atomicMin(pFound, startIndex);
}
//Version 3: Shared
__global__ void gpuSearchTexSha(int lenT, int lenP, int *pFound)
{
extern __shared__ char shaP[];
for (int i=0;threadIdx.x+i<lenP; i+=blockDim.x){
shaP[threadIdx.x+i]= tex1Dfetch(texP,threadIdx.x+i);
}
__syncthreads();
//At this point shaP is populated with the pattern
int startIndex = blockDim.x*blockIdx.x + threadIdx.x;
// only continue if an earlier instance hasn't already been found
int fMatch = 1;
for (int i=0; i < lenP; i++)
{
if (tex1Dfetch(texT,startIndex+i) != shaP[i]) fMatch = 0;
}
if (fMatch) atomicMin(pFound, startIndex);
}
我想什么都做是把文本到共享内存块,在这个问题的其余部分描述,为新版本保留纹理内存中的文本。
嗯,这正是我以为你的意思。如果你解释我的答案似乎对你错误,这将有所帮助。 – jmilloy 2011-04-09 15:35:49
也有两个具体的问题:什么是'blocksize'?和什么是'文本'(如'text [thread_id]')? – jmilloy 2011-04-09 16:27:25