与下面相同的代码,如果我将它们放在.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));
}
}