概述
参考文献
-
官方在线文档:https://docs.nvidia.com/cuda/archive/10.1/。
由于网页加载速度比较慢,可以参考如下文档。
-
CUDA_C_Programming_Guide:C编程指南。
-
CUDA_C_Best_Practices_Guide:代码优化指南。
-
CUDA_Runtime_API:CUDA API。
-
CUDA_Driver_API:驱动API。
概念
- Runtime API:可以理解为cuda的顶层API。使用简单,但效率较低。
- Driver API:可以理解为cuda的底层API。使用复杂,但是效率较高。
编译
编译工具
- 在visual studio中,要想编译win32 的cuda10.1程序,必须是visual studio 2013或更低的版本。所以这种情况下使用visual studio 2013。
- 在visual studio 2013创建工程时,分为Nvidia项目和Visual C++项目。如果没有cu文件,创建Visual C++项目即可,但必须有cuda头文件目录\NVIDIA GPU Computing Toolkit\CUDA\v10.1\include,链接必须输入如下目录的库\NVIDIA GPU Computing Toolkit\CUDA\v10.1\lib。
在win32下,visual studio 2013编译为ptx文件时候,Compiler Output(obj/cubin)应该输入data/%(Filename)32.ptx,而不是data/%(Filename)64.ptx。这样就可以编译运行了。
PTX
参考https://zhuanlan.zhihu.com/p/432674688。
PTX编译的一个中间文件,类似于Java的虚拟机。具体流程入下图。
![在这里插入图片描述](https://img-blog.csdnimg.cn/147ec14d99114260bff738ae3be23ba8.png#pic_center)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OwIzfzPy-1678019381784)(Images/编译PTX说明图.png)]
- 编译器将cu文件编译成ptx文件。
- 在执行过程中,根据具体的GPU类型,将其编译为cubin文件。
- 执行cubin文件。
直接从内存中加载PTX文件
在生成环境中,如果多一个ptx文件,会增加目录设置的工作。可以从内存中直接加载ptx文件的二进制数据,而不是读取ptx文件。
-
读取ptx文件,输出其二进制数据。
//计算二进制文件的长度并读取
fxoFile.seekg(0, std::ios_base::end);
int32_t size = (int)fxoFile.tellg();
fxoFile.seekg(0, std::ios_base::beg);
char *fxoData = new char[size];
fxoFile.read(fxoData, size);
//输出这些二进制数据
int32_t i = 0;
for (i = 0; i < size; i++) {
cout << left << setw(4) << int32_t(fxoData[i]) << ", ";
if (i != 0 && (i + 1) % 10 == 0)
cout << endl;
}
//输出其长度,核对正确性。
cout << "size = " << size << endl;
-
在程序中添加头文件。在其中输入char类型的数组,将输出的ptx二进制数据填入到这个数据中。
const char g_ptxBin[] =
{
......
};
-
在实际加载中,使用g_ptxBin地址即可。
性能