2015-08-21 3 views
1

Чтобы использовать Intel TBB (блокирование потоков) для работы с visual studio 2015, я попробовал следующий подход (поскольку по умолчанию встроенные двоичные файлы предназначены только для upto vs2013).Зависимость от msvcr120d.dll Visual Studio 2015 (Intel TBB)

Compile Intel TBB с Visual Studio 2015 -

  1. Загрузить исходный код Intel TBB от Here.
  2. Распакуйте,
  3. Откройте VS2010 Решение makefile.sln с пути tbb<version>\build\VS2010
  4. Одобрить преобразование файла проекта использовать Визуальная 2015 инструментарий
  5. Выбор конфигурации отладки и платформы x64 и Buid. (обратите внимание, если уже сделана предыдущая сборка, затем перестроить (очистить и построить)).
  6. Скопируйте dll, pdb, lib, exp, def файлы с tbb<version>\build\VS2010\intel64\Debug в tbb<version>\lib\Debug.

Создание нового проекта Пустой Visual C++

Сделайте следующие изменения для отладки, конфигурации x64

  1. Добавить дополнительные включают каталоги tbb<version>\include
  2. Добавить дополнительные каталоги библиотеки tbb<version>\lib\Debug
  3. Добавить следующие библиотечные зависимости

    tbbmalloc_debug.lib 
    tbbmalloc_proxy_debug.lib 
    tbb_debug.lib 
    
  4. Выберите Debug, x64 конфигурацию и сборку. Сборка прошла успешно.

Код, используемый для проверки этого ниже:

#include <iostream> 
#include <vector> 
#include <random> 

#include <tbb/parallel_for.h> 

// #include "..\Headers\MexMem.hpp" 

using namespace std; 

int main() { 

    std::vector<int> A(100, 0); 
    std::vector<int> B(100, 0); 
    std::vector<int> C(100, 0); 

    mt19937_64 RandNoEngine; 
    uniform_int_distribution<int> RandNoGenerator; 

    for (int i = 0; i < A.size(); ++i) { 
     A[i] = RandNoGenerator(RandNoEngine); 
     B[i] = RandNoGenerator(RandNoEngine); 
    } 

    tbb::parallel_for(tbb::blocked_range<int>(0, 100), [&](tbb::blocked_range<int> &Range) { 
     int beg = Range.begin(); 
     int end = Range.end(); 
     for (int i = beg; i < end; ++i) { 
      C[i] = A[i] * B[i]; 
     } 
    }); 
    cout << A[30] << " * " << B[30] << " = " << C[30] << endl; 
    system("pause"); 
    return 0; 
} 

Нажмите F5 для отладки, здесь я получаю сообщение об ошибке из Программа не может начать работу из-за MSVCP120D.dll отсутствует с вашего компьютера , Попробуйте переустановить программу, чтобы исправить эту проблему. Следующее сообщение связано с MSVCR120D.dll. Обратите внимание, что это происходит после того, как строить все (в том числе TBB библиотек) с помощью Visual 2015.

Дополнительная информация

Быстрый анализ с зависимостях Walker (depends.exe) дает следующие результаты:

зависимость tbb_debug.lib как ниже

- TBB_DEBUG.dll 
    - KERNEL32.DLL 
    - MSVCP140D.DLL 
    - VCRUNTIME140D.DLL 
    - UCRTBASED.DLL 

Однако зависимости tbb_debug.lib, как показано в Exe (EXE из выше PROGR am) является следующим:

- TBB_EXPERIMENT.EXE 
    - TBB_DEBUG.dll 
     ? MSVCP120D.DLL 
     ? MSVCR120D.DLL 
     - KERNEL32. 

Почему разница? Есть ли способ получить дополнительную информацию, связанную с этим, и, наконец, есть ли способ правильно компилировать и отлаживать Intel TBB на Visual Studio 2015?

+0

Вы проверили полный путь в зависимости от библиотеки DLL? Это похоже на загрузку неправильного TBB_DEBUG.dll. – 1201ProgramAlarm

+0

@ 1201ProgramAlarm Ah Да. Это действительно так. Я думаю, это связано с тем, что я недавно обновил Visual Studio, и что-то все еще заставляет Visual Studio работать в студии Composer Libs. Я посмотрю, что вызывает это, посмотрим, смогу ли я исправить это и сообщить вам. – Atimaharjun

+0

@ 1201ПрограммаAlarm Вы ударяете ноготь по голове. Во время работы над предыдущей версией я включил библиотеку распределенных библиотек Intel TBB в переменную среды пути, которая заставляет Visual Studio обходить папки, которые я сказал им, чтобы посмотреть. Пожалуйста, отправьте свой комментарий в качестве ответа, я пометю его как принятый. – Atimaharjun

ответ

1

Похоже, что это загрузка неправильного TBB_DEBUG.DLL. Проверьте полный путь к DLL в Dependency Walker.

Смежные вопросы