Несоответствие производительности между графическим процессором и процессором при умножении матриц: Eigen против ViennaCC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Несоответствие производительности между графическим процессором и процессором при умножении матриц: Eigen против ViennaC

Сообщение Anonymous »

Я столкнулся с проблемой производительности при выполнении операций умножения матриц с использованием библиотек 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»