Parallel processing cuda的多线程循环
我想做一个for循环,用cuda测试2^41的值。 我写了这段代码,但是它测试了同一个键好几次,但是我只想测试一次,我不知道为什么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
__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上的并行编程概念不太熟悉。但是,我将尝试获取更多关于这个主题的信息。