对于我的最后一年项目,我选择构建一个开发人员可以使用CUDA进行GPGPU计算的库,而不必理解CUDA API的不同内核实现背后的机制(换句话说,就是CUDA包装器)。该库可能类似于openMP库。对于那些不熟悉openMP的人来说,它是一个支持C语言的多平台共享内存多处理编程的API,其中数据布局和分解由指令自动处理。例如,API将块中的每个代码并行化:
long sum = 0, loc_sum = 0;
/*forks off the threads and starts the work-sharing construct*/
#pragma omp parallel for private(w,loc_sum) schedule(static,1)
{
for(i = 0; i < N; i++)
{
w = i*i;
loc_sum = loc_sum + w*a[i];
}
#pragma omp critical
sum = sum + loc_sum;
}
printf("\n %li",sum);
就我而言,我想在GPU上实现CUDA并行计算的相同功能。因此,我需要构建一组影响运行时行为的编译器指令,库例程和环境变量。必须向程序员隐藏CUDA中的每个调用。
由于CUDA是一种SIMD架构,我知道有许多因素需要考虑,尤其是迭代之间的依赖性。但是现在我认为程序员知道GPGPU计算的局限性。
现在,我需要你的帮助。谁能给我任何关于从哪里开始建立这样一个图书馆的建议?另外,有没有人有任何好的教程可以帮助我处理编译器指令或环境变量?或者,有没有人知道任何其他类似任务的库,我可以从中获得一个好的文档?
最重要的是,您认为这是一个可以在大约1200小时内完成的项目吗?我已经对GPGPU和CUDA有点熟悉,但建立这样的库对我来说是新的。
答案 0 :(得分:1)
这有点主观,但这听起来像是一个非常具有挑战性的项目。需要花费大量的思考和计划才能很好地构建一个问题,以便从主机到gpu的数据传输得到回报,并且只对一部分问题有意义。
对于执行类似操作的现有项目,有一些简单的包装器,如PyCUDA和PyOpenCL,它们包含一些GPU功能,如矩阵数学。可能最接近的是theano,它专注于相当数学计算,但它可以很好地抽象掉GPU组件。
答案 1 :(得分:1)
这不是编写库而是重写编译器的一部分。 GCC和Visual Studio都不允许你定义自己的pragma,一方面,你需要很好地使用内置的优化器。
老实说,在我看来,实际的GPGPU部分很容易。
如果您想了解他们如何在GCC中使用OpenMP,我建议您查看GOMP project历史记录。