Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2018, 22:08   #1
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию Как собрать статическую библиотеку с CUDA в MS VC 2015?

Я хочу создать статическую библиотеку с кодом CUDA.

Собственно, там такой код:
MarchingCubesLib.h
Код:
#include <cstdint>


struct FOutFloat3
{
    float x;
    float y;
    float z;
};

struct FOutVertex
{
    FOutFloat3 position;
    FOutFloat3 normal;
};

struct FOutTriangle
{
    FOutVertex vertices[3];
};

#pragma pack(push, 1)
struct FOutMeshPart
{
    uint32_t count = 0;
    FOutTriangle* triangles = nullptr;
    FOutMeshPart() noexcept {}
    ~FOutMeshPart();
};
#pragma pack(pop)

#pragma pack(push, 1)
struct FMarchingCubesParams
{
    uint32_t rows;
    uint32_t columns;
    uint32_t slices;
    uint16_t cube_size;
    // horizontal(x), vertical(y), depth(z)
    float voxel_size_mm[3];
    float iso_level;
};
#pragma pack(pop)

enum MarchingCubesResult {
    Success, DeviceError, Error
};

MarchingCubesResult MarchingCubes(float* data, FOutMeshPart& polygons, const FMarchingCubesParams params);
И реализация в MarchingCubesLib.cu

Код:
MarchingCubesResult MarchingCubes(float * data, FOutMeshPart& polygons, const FMarchingCubesParams params)
{
    // Thread number set up
    // TODO: exchange number of blocks and threads
    const int threads = params.slices / params.cube_size;
    const dim3 blocks(params.rows / params.cube_size, params.columns / params.cube_size, 1);
    const int grid_size = blocks.x * blocks.y * threads;

    cudaError_t cudaResult = cudaSetDevice(0);
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::DeviceError;

    CudaSmartPtr<uint8_t> poly_nums;
    CudaSmartPtr<FMarchingCubesParams> paramsOnDevice;
    CudaSmartPtr<float> dataOnDevice;

    cudaResult = cudaMallocManaged(&paramsOnDevice.ptr, sizeof(params));
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;
    cudaResult = cudaMemcpy(paramsOnDevice.ptr, &params, sizeof(params), cudaMemcpyHostToDevice);
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;

    cudaResult = cudaMallocManaged(&poly_nums.ptr, grid_size * sizeof(uint8_t));
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;
    cudaResult = cudaMalloc(&dataOnDevice.ptr, params.rows*params.columns*params.slices * sizeof(float));
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;
    cudaResult = cudaMemcpy(dataOnDevice.ptr, data, params.rows*params.columns*params.slices * sizeof(float), cudaMemcpyHostToDevice);
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;

    count_polygons <<<blocks, threads >>> (dataOnDevice.ptr, paramsOnDevice.ptr, poly_nums.ptr);
    cudaResult = cudaGetLastError();
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;
    cudaDeviceSynchronize();

    CudaSmartPtr<int> start_indexes_for_kernels;
    cudaResult = cudaMallocManaged(&start_indexes_for_kernels.ptr, grid_size * sizeof(int));
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;
    size_t total_triangle_num = 0;
    for (size_t i = 0; i < grid_size; ++i)
    {
        start_indexes_for_kernels.ptr[i] = total_triangle_num;
        total_triangle_num += poly_nums.ptr[i];
    }
    poly_nums.free();

    CudaSmartPtr<FOutTriangle> triangles;
    cudaResult = cudaMalloc(&triangles.ptr, total_triangle_num * sizeof(FOutTriangle));
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;

    polygonyse <<<blocks, threads>>> (dataOnDevice.ptr, paramsOnDevice.ptr, start_indexes_for_kernels.ptr, triangles.ptr);
    cudaResult = cudaGetLastError();
    if (cudaResult != cudaError_t::cudaSuccess)
        return MarchingCubesResult::Error;
    cudaDeviceSynchronize();

    // Copy data to result
    delete[] polygons.triangles;
    polygons.triangles = nullptr;
    polygons.count = total_triangle_num;
    polygons.triangles = new FOutTriangle[total_triangle_num];
    cudaMemcpy(polygons.triangles, triangles.ptr, total_triangle_num * sizeof(FOutTriangle), cudaMemcpyDeviceToHost);

    return MarchingCubesResult::Success;
}
В настройках указал ConfigurationType: Static Library (lib).

В итоге он собирает этот lib файл, но при попытке подключить библиотеку к другому проекту, в нём появляются ошибки вида
Цитата:
unresolved external symbol cudaDeviceSynchronize
Project1 D:\Programs\tmp\Project1\MarchingCu besLib.lib(MarchingCubesLib.cu.obj) 1
То есть, в библиотеке нет реализаций методов CUDA.
Как сделать так, чтобы получилась нормальная библиотека?
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 22.05.2018, 22:41   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Явно cudaDeviceSynchronize лежит в другой библиотеке.
waleri вне форума Ответить с цитированием
Старый 22.05.2018, 23:45   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Задам немного странный вопрос: а вы саму CUDA-либу cudart_static.lib то линкуете?
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помочь собрать программу без динамических зависимостей на visual studio 2015 1000руб hidden_sl0t Фриланс 2 11.11.2016 13:18
[CUDA] параллельный метод бактерий на cuda mamant1 Фриланс 4 13.12.2011 08:27
Нужно собрать графическую библиотеку veshiyoleg Фриланс 4 26.10.2011 19:02