如果使用NVCC构建代码,则与使用g ++构建代码相比,Matrix3f * Vector3f的性能要差得多。

时间:2019-07-17 13:45:32

标签: linux eigen3 nvidia-jetson

与下面相同的代码,如果我将它们放在.cpp文件中并使用g ++或nvcc进行构建,则性能良好(<1us),但是如果我将下面的代码放入.cu文件并使用nvcc进行构建,则性能差(约90us)。

有人能启发我为什么在.cu文件中使用相同的代码会导致性能下降吗?而且我不确定这是否与https://eigen.tuxfamily.org/dox-devel/TopicCUDA.html中描述的问题有关?

1)。使用 g ++ 构建 .cpp 文件的命令:

  $ /usr/bin/g++ -std=c++11 -O3 -o test.cpp.o -c test.cpp
  $ /usr/bin/g++ -std=c++11 -O3 -o test_cpp test.cpp.o

2)。使用 nvcc 构建 .cpp 文件的命令:

  $ /usr/local/cuda-10.0/bin/nvcc -ccbin g++ -m64 -std=c++11 -O3   -gencode arch=compute_70,code=sm_70 -gencode arch=compute_72,code=sm_72 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_75,code=compute_75 -o test_cuda_cpp.o -c test.cpp
  $ /usr/local/cuda-10.0/bin/nvcc -ccbin g++ -m64 -std=c++11 -O3  -gencode arch=compute_70,code=sm_70 -gencode arch=compute_72,code=sm_72 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_75,code=compute_75 -o test_cuda_cpp test_cuda_cpp.o

3)。使用 nvcc 构建 .cu 文件的命令:

  $ /usr/local/cuda-10.0/bin/nvcc -ccbin g++ -m64 -std=c++11 -O3   -gencode arch=compute_70,code=sm_70 -gencode arch=compute_72,code=sm_72 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_75,code=compute_75 -o test_cuda.o -c test.cu
  $ /usr/local/cuda-10.0/bin/nvcc -ccbin g++ -m64 -std=c++11 -O3  -gencode arch=compute_70,code=sm_70 -gencode arch=compute_72,code=sm_72 -gencode arch=compute_75,code=sm_75 -gencode arch=compute_75,code=compute_75 -o test_cuda test_cuda.o

这些已在NVIDIA Jetson AGX Xavier平台上进行了测试。 CPU,GPU和EMC时钟都被锁定。

 #include <vector>
 #include <eigen3/Eigen/Dense>
 #include <eigen3/Eigen/Core>
 #include <sys/time.h>

 int main()
 {
    Eigen::Vector3f point(1.0, 1.4, 8.2);
    Eigen::Matrix3f inv_cov;
    inv_cov.setZero();
    inv_cov(0,0) = 2;
    inv_cov(0,2) = inv_cov(2,0) = 1;
    Eigen::Vector3f result = inv_cov * point;
    struct timeval start, end;
    int i = 50;

    while(i--) {
        gettimeofday(&start, NULL);
        for (int i = 0; i < 100000; i++) {
            result = inv_cov * point;
        }
        gettimeofday(&end, NULL);
        printf("time diff: %ld us\n", (end.tv_sec - start.tv_sec) * 1000000 +
               (end.tv_usec - start.tv_usec));
    }
 }

0 个答案:

没有答案