Как скомпилировать C ++ с библиотекой CUB? - PullRequest
0 голосов
/ 31 марта 2020

Я использую функцию устройства CUB, как в примере, приведенном здесь (https://forums.developer.nvidia.com/t/cub-library/37675/2). Мне удалось скомпилировать исходный файл .cu в приведенном выше примере, используя nvcc.

Однако мне интересно, можно ли вызвать функцию устройства CUB в исходном файле cpp и скомпилировать . cpp исходный файл (используется nvcc или g++)? Я знаю, что это возможно для thrust, так как пример здесь работает для меня.

В настоящее время я просто перемещаю функцию main в новый файл main. cpp и включаю заголовок cub файл в main. cpp, но мне не удалось скомпилировать его с помощью nv cc или g ++ из-за тех же ошибок, часть сообщения об ошибке:

/home/xx/cub/cub/block/specializations/../../block/../util_type.cuh:261:5: error: ‘__host__’ does not name a type; did you mean ‘__loff_t’?
         __host__ __device__ __forceinline__ NullType& operator =(const T&) { return *this; }
         ^~~~~~~~
         __loff_t
/home/xx/cub/cub/block/specializations/../../block/../util_type.cuh:316:19: error: ‘short4’ was not declared in this scope
     __CUB_ALIGN_BYTES(short4, 8)
                       ^
/home/xx/cub/cub/block/specializations/../../block/../util_type.cuh:314:52: error: ISO C++ forbids declaration of ‘__align__’ with no type [-fpermissive]
         { enum { ALIGN_BYTES = b }; typedef __align__(b) t Type; };
                                                        ^
/home/xx/cub/cub/block/specializations/../../block/../util_type.cuh:545:9: error: ‘__host__’ does not name a type; did you mean ‘__loff_t’?
             __host__ __device__ __forceinline__ CubVector operator+(const CubVector &other) const {         \
             ^
/home/xx/cub/cub/block/specializations/../../block/../util_arch.cuh:64:38: error: ‘__host__’ does not name a type; did you mean ‘CUhostFn’?
         #define CUB_RUNTIME_FUNCTION __host__ __device__
                                      ^
/home/xx/cub/cub/device/../iterator/arg_index_input_iterator.cuh:144:25: error: ‘__forceinline__’ does not name a type; did you mean ‘__thrust_forceinline__’?
     __host__ __device__ __forceinline__ ArgIndexInputIterator(
                         ^~~~~~~~~~~~~~~
                         __thrust_forceinline__
/home/xx/cub/cub/device/device_reduce.cuh:148:12: error: ‘cudaError_t’ does not name a type; did you mean ‘cudaError_enum’?
     static cudaError_t Reduce(
            ^~~~~~~~~~~
            cudaError_enum

Вот мои исходные файлы:

device.h

#pragma once

#include <cub/cub.cuh>

void scan_on_device();

device.cu

#include "device.h"

void scan_on_device()
{
  // Declare, allocate, and initialize device pointers for input and output
  int num_items = 7;
  int *d_in;
  int h_in[]  = {8, 6, 7, 5, 3, 0, 9};
  int sz = sizeof(h_in)/sizeof(h_in[0]);
  int *d_out; // e.g., [ , , , , , , ]
  cudaMalloc(&d_in,  sz*sizeof(h_in[0]));
  cudaMalloc(&d_out, sz*sizeof(h_in[0]));
  cudaMemcpy(d_in, h_in, sz*sizeof(h_in[0]), cudaMemcpyHostToDevice);
  printf("\nInput:\n");
  for (int i = 0; i < sz; i++) printf("%d ", h_in[I]);
  // Determine temporary device storage requirements
  void *d_temp_storage = NULL;
  size_t temp_storage_bytes = 0;
  cub::DeviceScan::InclusiveSum(d_temp_storage, temp_storage_bytes, d_in, d_out, num_items);
  // Allocate temporary storage
  cudaMalloc(&d_temp_storage, temp_storage_bytes);
  // Run inclusive prefix sum
  cub::DeviceScan::InclusiveSum(d_temp_storage, temp_storage_bytes, d_in, d_out, num_items);
// d_out s<-- [8, 14, 21, 26, 29, 29, 38]
  cudaMemcpy(h_in, d_out, sz*sizeof(h_in[0]), cudaMemcpyDeviceToHost);
  printf("\nOutput:\n");
  for (int i = 0; i < sz; i++) printf("%d ", h_in[i]);
  printf("\n");
}

хост. cpp

#include "device.h"
#include <cub/cub.cuh>

int main(void)
{
    scan_on_device();

    return 0;
}

Я пытался скомпилировать их в три этапа:

nvcc -O2 -c device.cu -I/home/xx/cub
g++  -O2 -c host.cpp  -I/usr/local/cuda/include/ -I/home/xx/cub
g++ -o tester device.o host.o -L/usr/local/cuda/lib64 -lcudart

Первый шаг прошел хорошо, но второй шаг дает вышеуказанные ошибки. Любые идеи приветствуются. Может быть, я испортил некоторые ссылки (на cuda или cub)?

1 Ответ

1 голос
/ 31 марта 2020

Библиотека заголовочных кубов (например, cub.cuh) содержит код CUDA C ++. Такой код не может быть скомпилирован обычным хост-компилятором, таким как g ++. Если вы попытаетесь это сделать, вы получите ошибки компиляции.

Однако ваш проект не требует, чтобы cub.cuh был в вашем заголовочном файле device.h, и не требует, чтобы cub.cuh компилировался с помощью g ++. , В заголовочном файле device.h требуется только один прототип функции для scan_on_device().

. Поэтому, если вы включите заголовочный файл cub в файл реализации функции device.cu и удалите его в другом месте вашего проекта , ваш код скомпилируется.

...