C++ 为什么CUDA程序的初始执行时间比后续执行时间长?

C++ 为什么CUDA程序的初始执行时间比后续执行时间长?,c++,cuda,thrust,C++,Cuda,Thrust,我有test.cu文件,它是用NVCC编译的 void sort() { thrust::host_vector<int> dat1(50); thrust::generate(dat1.begin(),dat1.end(),rand); for(int i=0; i<dat1.size(); i++) { std::cout << dat1[i] << std::endl; } thrust::device_vector<int&g

我有test.cu文件,它是用NVCC编译的

void sort()
{

thrust::host_vector<int> dat1(50);
thrust::generate(dat1.begin(),dat1.end(),rand);

for(int i=0; i<dat1.size(); i++)
{
    std::cout << dat1[i] << std::endl;
}

thrust::device_vector<int> dev_vec1 = dat1;


thrust::sort(dev_vec1.begin(),dev_vec1.end());
thrust::copy(dev_vec1.begin(),dev_vec1.end(),dat1.begin());

for(int i=0; i<dat1.size(); i++)
{
    std::cout << dat1[i] << std::endl;
}

}


#include "test.cuh"


int main()
{
   sort();
   return 0;
}
void排序()
{
推力:主机向量dat1(50);
生成(dat1.begin(),dat1.end(),rand);

对于(int i=0;i最可能的原因是,在第一次运行期间,您的操作系统正在加载CUDA库,并在CUDA上下文实际初始化之前执行一些其他技术任务。在第二次运行时,所有内容都已加载,上下文初始化速度更快。

最可能的原因是,在第一次运行期间,您的操作系统正在加载CUDA库在CUDA上下文的实际初始化之前,启动并执行一些其他技术任务。在第二次运行时,所有内容都已加载,上下文初始化速度更快。

在linux系统上可能有帮助的一件事是将GPU设置为持久化模式。
nvidia smi-g 0-pm 1
,您可以通过
nvidia smi--help
获得帮助。另一个影响因素可能是JIT编译步骤,具体取决于您编译代码的方式。当您第一次启动的新代码没有相关GPU的实际二进制文件时,它必须执行最后一个编译步骤来创建它。这通常只会发生一次,因为它是缓存的。您可以通过发出comp使用适当的-arch=sm_xx开关进行编译,其中xx是GPU的计算能力“您可以通过使用适当的-arch=sm_xx开关进行编译来避免这种情况,其中xx是GPU的计算能力”怎么做?你有什么类型的GPU,你使用的nvcc编译命令行是什么?你可以通过运行GPU获得计算能力。比如说我有一个GeForce GTX 560。那么我的计算能力是2.1,现在让我们假设我的应用程序源文件是sort.cu。要编译它,我会发出命令
nvcc-arch=sm_21-o sort sort.cu
开关告诉编译器为您的特定设备生成代码。您可以获得更多帮助,或者使用nvcc--help
初始延迟几乎可以肯定是JIT所需的时间。在linux系统上可能有帮助的一件事是将GPU设置为持久模式。
nvidia smi-g0-pm 1
,您可以通过nvidia smi--help获得帮助。另一个影响因素可能是JIT编译步骤,具体取决于您编译代码的方式。当您第一次启动一个没有相关GPU实际二进制文件的新代码时,它必须执行最后一个编译步骤来创建它。这通常只会发生在n一次,因为它是缓存的。您可以通过使用适当的-arch=sm_xx开关发出编译命令来避免这种情况,其中xx是GPU的计算能力“您可以通过使用适当的-arch=sm_xx开关发出编译命令来避免这种情况,其中xx是GPU的计算能力”怎么做?你有什么类型的GPU,你使用的nvcc编译命令行是什么?你可以通过运行GPU获得计算能力。比如说我有一个GeForce GTX 560。那么我的计算能力是2.1,现在让我们假设我的应用程序源文件是sort.cu。要编译它,我会发出命令
nvcc-arch=sm_21-o sort sort.cu
开关告诉编译器为您的特定设备生成代码。您可以获得更多帮助,或者使用nvcc--help初始延迟几乎可以肯定是JIT所需的时间。您可以通过使用适当的-arch=sm_xx开关发出编译命令来避免这一情况,其中xx是coGPU的计算能力如何做到这一点?您可以通过使用适当的-arch=sm_xx开关发出编译命令来避免这种情况,其中xx是GPU的计算能力如何做到这一点?