Parallel processing cuda的多线程循环

Parallel processing cuda的多线程循环,parallel-processing,cuda,Parallel Processing,Cuda,我想做一个for循环,用cuda测试2^41的值。 我写了这段代码,但是它测试了同一个键好几次,但是我只想测试一次,我不知道为什么 __global__ void kernel(int fileSize, unsigned char * buffer) { for(mot64 i3 = 0L; i3 < (1L << 41); i3++){ deCipher(buffer, i3, fileSize); } return; } \uuuuu全局\u

我想做一个for循环,用cuda测试2^41的值。 我写了这段代码,但是它测试了同一个键好几次,但是我只想测试一次,我不知道为什么

__global__ void kernel(int fileSize, unsigned char * buffer)
{
   for(mot64 i3 = 0L; i3 < (1L << 41); i3++){
     deCipher(buffer, i3, fileSize);
   }
   return;
}
\uuuuu全局\uuuuuu无效内核(整型文件大小,无符号字符*缓冲区)
{

对于(mot64 i3=0L;i3<(1L您似乎并不真正了解大规模并行GPU计算的基本原理,因此我将尽力为您“快速”解释正在发生的事情。但实际上,您会想读一些关于它的好书,因为这是一个庞大而复杂的主题

在CUDA中启动内核时,您启动它是为了在特定数量的线程上运行,如下所示:

kernel<<<blocks, threads>>>(fileSize, buffer);
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for (int i = index; i < sizeOfYourData; i += stride)
{
    // [...]
}
__global__ void kernel(int fileSize, unsigned char * buffer)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
    int stride = blockDim.x * gridDim.x;

    for (int i3 = index; i3 < (1L << 41); i3 += stride)
    {
        deCipher(buffer, i3, fileSize);
    }

    return;
}

如您所见,网格是二维的,这两个维度被方便地称为
x
y
。想想行和列。
索引告诉您的是您在网格上的水平位置。
跨距
告诉您每行有多长,可以将其视为偏移量

因此,在内核中有一个如下循环:

kernel<<<blocks, threads>>>(fileSize, buffer);
int index = blockIdx.x * blockDim.x + threadIdx.x;
int stride = blockDim.x * gridDim.x;
for (int i = index; i < sizeOfYourData; i += stride)
{
    // [...]
}
__global__ void kernel(int fileSize, unsigned char * buffer)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
    int stride = blockDim.x * gridDim.x;

    for (int i3 = index; i3 < (1L << 41); i3 += stride)
    {
        deCipher(buffer, i3, fileSize);
    }

    return;
}

这里到底有什么让您感到惊讶?内核函数由您启动的每个线程运行。因此,正如在内核函数中所写的,每个线程都将循环0到2^41-1的值。如果您希望每个线程测试不同的值,那么您必须以这样的方式编写循环:每个线程将测试不同的值…谢谢非常感谢您的解释。事实上,我对GPU上的并行编程概念不太熟悉。但是,我将尝试获取更多关于这个主题的信息。