Зачем мне отдельная компиляция? - PullRequest
0 голосов
/ 17 мая 2018

У меня есть код, показанный ниже.Насколько я понял, разделяемая компиляция должна быть включена, когда

  1. код устройства CUDA разделен на файлы .h и .cu
  2. Использовать код устройства ObjectA в код устройства Object B

однако, в моей основной функции у меня нет ни одного из случаев выше.Не могли бы вы сказать мне, почему я должен установить отдельную компиляцию для этого примера проекта?

BitHelper.h

#pragma once
#include <cuda_runtime.h>

#define COMPILE_TARGET __host__ __device__

class BitHelper
{
public:
    COMPILE_TARGET BitHelper();
    COMPILE_TARGET ~BitHelper();

    COMPILE_TARGET static void clear(unsigned int& val0);
};

BitHelper.cu

#include "bithelper.h"

BitHelper::BitHelper()
{}

BitHelper::~BitHelper()
{}

void BitHelper::clear(unsigned int& val0)
{
    val0 = 0x0000;
}

Consume_BitHelper.h

#pragma once

class Consume_BitHelper
{
public:
    void apply();

private:
    bool test_cpu();
    bool test_gpu();
};

Consume_BitHelper.cu

#include "consume_bithelper.h"

#include <cuda_runtime.h>
#include <iostream>

#include "bithelper.h"

__global__
void myKernel()
{
    unsigned int FLAG_VALUE = 0x2222;
    printf("GPU before: %d\n", FLAG_VALUE);
    BitHelper::clear(FLAG_VALUE);
    printf("GPU after: %d\n", FLAG_VALUE);
}

void Consume_BitHelper::apply()
{
    test_cpu();
    test_gpu();
    cudaDeviceSynchronize();
}

bool Consume_BitHelper::test_cpu()
{
    std::cout << "TEST CPU" << std::endl;
    unsigned int FLAG_VALUE = 0x1111;
    std::cout << "CPU before: " << FLAG_VALUE << std::endl;
    BitHelper::clear(FLAG_VALUE);
    std::cout << "CPU after : " << FLAG_VALUE << std::endl;
    return true;
}

bool Consume_BitHelper::test_gpu()
{
    std::cout << "TEST GPU" << std::endl;
    myKernel << <1, 1 >> > ();
    return true;
}

main.cu

#include "consume_bithelper.h"
#include "bithelper.h"

#include <iostream>

int main(int argc, char** argv)
{
    Consume_BitHelper cbh;
    cbh.apply();

    std::cout << "\nPress any key to continue...";
    std::cin.get();

    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(cuda_class LANGUAGES CXX CUDA)

#BitHelper needs separable compilation because we have separated declaration from definition
add_library(bithelper_lib STATIC bithelper.cu)
set_property(TARGET bithelper_lib PROPERTY CUDA_SEPARABLE_COMPILATION ON)

#Consume_BitHelper needs separable compilation because we call BitHelper's device code
#from Consume_BitHelper's kernel
add_library(consume_bithelper_lib STATIC consume_bithelper.cu)
set_property(TARGET consume_bithelper_lib PROPERTY CUDA_SEPARABLE_COMPILATION ON)
target_link_libraries(consume_bithelper_lib bithelper_lib)

#We only call CPU code so no need of separable compilation?
add_executable(${PROJECT_NAME} main.cu)
target_link_libraries(${PROJECT_NAME} bithelper_lib consume_bithelper_lib)

Я получаю следующие ошибки: enter image description here

РЕДАКТИРОВАТЬ

Согласно сообщению Роберта Кровеллы Consume_BitHelper.cu использует BitHelper::clear, определенное в отдельной единице компиляции .

  1. Означает ли это, что мне нужно активировать только отдельную компиляцию для BitHelper?

Поскольку отдельная компиляция имеет отношение только к коду устройства под названиемиз кода устройства.

Почему я получаю упомянутые ошибки, когда для cuda_class НЕ включена отдельная компиляция?(это исполняемый файл, созданный из CMake и не вызывающий код устройства)

1 Ответ

0 голосов
/ 28 мая 2018

Раздельная компиляция связана с тем, как компилятор обрабатывает вызовы функций. В обмен на небольшие накладные расходы вы получаете возможность совершать истинные вызовы функций и, таким образом, получать доступ к коду из других «модулей компиляции» (т.е. исходных файлов .cu).

Поскольку программисты на GPU озабочены производительностью (особенно дополнительными регистрами, которые используются, когда включена раздельная компиляция), Nvidia сделала это опцией вместо значения по умолчанию.

Вам нужна только отдельная компиляция для файлов .cu, которые обращаются к функциям / глобальным переменным, определенным в других файлах .cu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...