CUDA & Visual Studio 2008: проблемы при попытке связать разные проекты - PullRequest
1 голос
/ 04 марта 2011

Обыскивая сеть для ответа на мою проблему, я видел несколько сообщений на форумах и в блогах, посвященных теме «Как настроить, скомпилировать, связать и запустить проект CUDA в VIsual Studio 2008»

(Я пытался дать ссылки, но мне не разрешено, как новый постер: p)

Но чего здесь не хватает?

Чего не хватает, так это того, что во всех вышеперечисленных руководствах или публикациях рассказывается, как настроить один проект VS, который будет проектом запуска и будет запускаться сам по себе. Как следствие, они используют «Правило CUDA Runtime API», которое предназначено для создания CUDA-дружественного файла .exe.

Что мне нужно / нужно?

1) Я хочу иметь решение VS, которое будет содержать несколько проектов, большинство из которых написаны на C ++. Будет один основной проект, написанный на C ++, создающий файл «.exe» (содержащий функцию «main» и, следовательно, управляющий потоком), и несколько других проектов, которые будут создавать соответствующие файлы «.lib», с которыми будет связан основной проект. 2) В простейшей форме мне нужен один проект, который будет выполнять CUDA, который создаст файл lib и основной проект, который будет ссылаться на него и использовать его.

Я искал везде безрезультатно, похоже, никто не использует несколько проектов.

Моя проблема: 1) Проект CUDA создает библиотеку и поэтому должен использовать «Правило API драйвера CUDA», а не вариант времени выполнения (если я осмелюсь сделать это, проект CUDA попытается использовать библиотеки, используемые основным, и есть несколько определенных проектов » 2) При попытке сделать это надлежащим образом основной проект не может ссылаться на проект CUDA

Вот пример кода, который я использую, чтобы показать, в чем заключается сделка (здесь я также приложу файл VS sln для тех, кто хочет попробовать его)

Outline:
    VS Solution
        Main Project(C++ project producing the .exe and containing the main function)
            main.cpp

                #include "../CUDAProject/testCuda.h"

                int
                main(int argc, char** argv)
                {

                    testCudaClass* t2;
                    t2 = new testCudaClass();
                    t2->stub_function();

                    return 0;
                }

        CUDA Project:
            testCuda.h

                #include <cstdio>
                #include <cstdlib>
                #include <iostream>

                class testCudaClass
                {
                public:
                    void stub_function();
                };

            testCuda.cpp

                #include "testCuda.h"
                extern "C" int cuda_function();

                void testCudaClass::stub_function()
                {
                    int a;
                    a=cuda_function();
                    std::cout<< a <<"\n";
                }

            test.cu

                #include "cuda.h"

                extern "C" int cuda_function()
                {
                    return 5;
                }           

Прикреплено (временные общедоступные ссылки в Dropbox) - это zip-файл с двумя решениями VS2008, в котором у меня есть один проект CUDA, который работает нормально, и в котором я пытаюсь сделать это выше (часть кода проекта описана выше)

http://dl.dropbox.com/u/3091507/CUDA.zip

Я был бы очень признателен за любую информацию или совет, который может помочь мне решить эту проблему

Большое спасибо Адам

1 Ответ

1 голос
/ 04 марта 2011

Я проверил ваш код, и это то, что я сделал, чтобы успешно скомпилировать и запустить его:

  • Использовал CUDA Runtime API (его можно использовать, даже если у вас несколько проектов)

  • MainProject -> Свойства конфигурации -> Linker -> General -> Дополнительные каталоги библиотеки: добавлен путь к библиотекам CUDA (это одна из подпапок пути установки CUDA)

  • MainProject -> Свойства конфигурации -> Линкер -> Ввод -> Дополнительные зависимости: добавлено "cudart.lib"

  • MainProject -> Свойства конфигурации -> Linker -> Input -> Ignore Specific Library: добавлен «LIBCMT» для удаления этого предупреждения о конфликтах.

  • Убедитесь, что вы используете одну и ту же «Библиотеку времени выполнения» для обычных .cpp и .cu. В вашем случае это не совпадало, и, похоже, это было причиной несовместимости библиотеки abount. Сравните значения:

    • C / C ++ -> Генерация кода -> Библиотека времени выполнения

    • CUDA Runtime API -> Host -> Runtime Library

Кроме того, вы генерируете «testCppProject.lib» и «CUDAProject.lib», но вы включаете «test.lib» и «CUDAProject.lib», где первая - это более старая версия библиотеки.

...