Я столкнулся с проблемой производительности при выполнении операций умножения матриц с использованием библиотек Eigen и ViennaCL на C++. Я сравниваю производительность выполнения этих операций на встроенном графическом процессоре моей системы и на центральном процессоре.
Моя система оснащена встроенным графическим процессором Intel, и я запускаю код на Intel Core i5 восьмого поколения. К моему удивлению, я обнаружил, что умножение матриц занимает около 200 секунд при выполнении на графическом процессоре с использованием ViennaCL, тогда как на процессоре с использованием Eigen оно занимает всего около 20 секунд.
Я озадачен этим несоответствием в производительности и хотел бы лучше понять причину этого. Может ли встроенный графический процессор действительно иметь такую низкую производительность по сравнению с процессором при операциях умножения матриц?
Я использую premake
workspace "Project"
configurations { "Debug", "Release" }
location "build"
project "Project"
kind "ConsoleApp"
language "C++"
targetdir "build/bin/%{cfg.buildcfg}"
objdir "build/obj/%{cfg.buildcfg}"
files { "src/*.cpp", "include/*.hpp" }
includedirs { "include", "vendor/*" }
filter "configurations:Debug"
symbols "On"
optimize "On"
filter "configurations:Release"
symbols "Off"
optimize "On"
filter {}
@:~/repos/cpp-projct$ tree -L 1
.
├── build
├── cr.sh
├── include
├── premake.lua
├── src
└── vendor (eigen and viennaCL here, just $ wget and $ tar)
Изменить:
Код отредактирован с предложениями, вывод в файле file.txt;
Я не проверял предложение использовать целые числа или другой тип, потому что я не мог просто поменять его местами.
#include
#include
#include
#include
#include
#include
#include
int main() {
const int size = 1500; // Size of the matrices
std::string fileName1 = "./list1.txt";
std::string fileName2 = "./list2.txt";
// Creating two large matrices using ViennaCL
viennacl::matrix matrix1_viennacl(size, size);
viennacl::matrix matrix2_viennacl(size, size);
// Creating two large matrices using Eigen
Eigen::MatrixXf matrix1_eigen(size, size);
Eigen::MatrixXf matrix2_eigen(size, size);
// Initializing the matrices with random values
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
matrix1_viennacl(i, j) = rand() / static_cast(RAND_MAX);
matrix2_viennacl(i, j) = rand() / static_cast(RAND_MAX);
}
}
// Initializing the matrices with the same random values
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
matrix1_eigen(i, j) = matrix1_viennacl(i, j);
matrix2_eigen(i, j) = matrix2_viennacl(i, j);
}
}
//==============================================================
// Performing computation with the matrices using ViennaCL and
// measuring the execution time
auto start_viennacl = std::chrono::steady_clock::now();
viennacl::matrix result_viennacl =
viennacl::linalg::prod(matrix1_viennacl, matrix2_viennacl);
auto end_viennacl = std::chrono::steady_clock::now();
std::chrono::duration time_viennacl = end_viennacl - start_viennacl;
std::ofstream file1(fileName1);
if (!file1.is_open()) {
std::cout
Подробнее здесь: https://stackoverflow.com/questions/784 ... n-eigen-vs
Несоответствие производительности между графическим процессором и процессором при умножении матриц: Eigen против ViennaC ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Операция eigen::vector3d или eigen::matrix3d, приводящая к случайному результату nan или -nan
Anonymous » » в форуме C++ - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Операция eigen::vector3d или eigen::matrix3d, приводящая к случайному результату nan или -nan
Anonymous » » в форуме C++ - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-
-
-
`ValueError` в умножении матриц для реализации регрессии гауссовского процесса в Python
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
`ValueError` в умножении матриц для реализации регрессии гауссовского процесса в Python
Anonymous » » в форуме Python - 0 Ответы
- 14 Просмотры
-
Последнее сообщение Anonymous
-