use*_*210 19 c++ cuda gpu visual-studio-2008
我是CUDA的新手,需要帮助了解一些事情.我需要帮助并行化这两个for循环.具体来说,如何设置dimBlock和dimGrid以使其运行更快.我知道这看起来像sdk中的向量添加示例,但该示例仅适用于方形矩阵,当我尝试修改我的128 x 1024矩阵的代码时,它无法正常工作.
__global__ void mAdd(float* A, float* B, float* C)
{
for(int i = 0; i < 128; i++)
{
for(int i = 0; i < 1024; i++)
{
C[i * 1024 + j] = A[i * 1024 + j] + B[i * 1024 + j];
}
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码是一个更大的循环的一部分,是代码中最简单的部分,所以我决定尝试并行化thia并同时学习CUDA.我已经阅读了指南,但仍然不明白如何获得正确的号码.网格/块/线程的运行并有效地使用它们.
tal*_*ies 38
正如您所写,内核完全是串行的.为执行它而启动的每个线程都将执行相同的工作.
CUDA(以及OpenCL和其他类似的"单程序,多数据"类型编程模型)背后的主要思想是你采取"数据并行"操作 - 因此必须多次执行相同的,基本上独立的操作 - 并且编写执行该操作的内核.然后启动大量(半)自主线程以跨输入数据集执行该操作.
在您的数组添加示例中,数据并行操作是
C[k] = A[k] + B[k];
Run Code Online (Sandbox Code Playgroud)
对于0到128*1024之间的所有k.每个加法操作是完全独立的,没有排序要求,因此可以由不同的线程执行.要在CUDA中表达这一点,可以像这样编写内核:
__global__ void mAdd(float* A, float* B, float* C, int n)
{
int k = threadIdx.x + blockIdx.x * blockDim.x;
if (k < n)
C[k] = A[k] + B[k];
}
Run Code Online (Sandbox Code Playgroud)
[免责声明:用浏览器编写的代码,未经测试,使用风险自负]
这里,串行代码的内部和外部循环被每个操作替换为一个CUDA线程,并且我在代码中添加了限制检查,以便在启动比所需操作更多线程的情况下,不会发生缓冲区溢出.如果然后像这样启动内核:
const int n = 128 * 1024;
int blocksize = 512; // value usually chosen by tuning and hardware constraints
int nblocks = n / nthreads; // value determine by block size and total work
madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);
Run Code Online (Sandbox Code Playgroud)
然后将256个块(每个包含512个线程)启动到GPU硬件上以并行执行阵列添加操作.请注意,如果输入数据大小不能表示为块大小的精确倍数,则需要向上舍入块的数量以覆盖整个输入数据集.
以上所有内容都是对CUDA范例进行非常简单的操作的简要概述,但也许它为您提供了足够的洞察力来继续自己.CUDA现在相当成熟,网上有很多优秀,免费的教育材料,你可以用来进一步说明我在这个答案中掩饰的编程模型的许多方面.