компилировать файлы CU и C с помощью CMake - PullRequest
1 голос
/ 08 октября 2019

Я пытаюсь скомпилировать программу, которая содержит файлы CUDA и C (не C ++), используя CMakeLists.

Моя программа состоит из нескольких файлов .c (без CUDA), одного файла .c (который вызывает функции cuBLAS и основные функции CUDA, такие как cudaMalloc, и он работает) и cuda.cu, который содержит следующий код (я помещаю все #include на случай, если что-либо отсутствует):


#include "cuda_runtime.h"
#include <stdio.h>
#include <stdlib.h>
#include "device_launch_parameters.h"
#include <device_functions.h>
#include <assert.h>
#include <cuda.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <float.h>
#include <sys/time.h>
//#include "cublas_kernels.h"
#define TILE_DIM 32
#define BLOCK_ROWS 8

#define GRID_SIZE 32
#define BLOCK_SIZE 32


__global__ void kernelfunction(float *a, float *b, int n) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    int stride = blockDim.x * gridDim.x;

    while (i < n)
    {
        b[i] = (a[i] > 0.f) ? 1.f : 0.f;
        i += stride;
    }
}

void function(float *a, float *b, int n)
{
    dim3 dimGrid(GRID_SIZE, GRID_SIZE);
    dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
    kernelfunction<<<dimGrid, dimBlock>>>(a, b, n);
}

Это CUDAчасть файла CMakeLists.txt:

    include(FindCUDA)
    find_package(CUDA)
    if(CUDA_FOUND)
        target_link_libraries(myprogram PRIVATE ${CUDA_CUBLAS_LIBRARIES} dl)
        target_link_libraries(myprogram PRIVATE ${CUDA_LIBRARIES} dl)
        set_target_properties(myprogram PROPERTIES CUDA_SEPARABLE_COMPILATION ON)
    endif()


, когда я пытаюсь скомпилировать его с файлом CMakeLists, я получаю следующую ошибку:

cuda.cu: undefined reference to `threadIdx'
cuda.cu: undefined reference to `blockIdx'
cuda.cu: undefined reference to `blockDim'
cuda.cu: undefined reference to `gridDim'

Я полагаю, мой make-файл неполон, так как еслиЯ компилирую файл (cuda.cu) отдельно с помощью nvcc, он компилируется без проблем.

Моя версия nvcc: инструменты компиляции Cuda, выпуск 9.1, V9.1.85

Моя версия CMake: версия cmake 3.100,2

1 Ответ

1 голос
/ 11 октября 2019

CUDA - это первоклассный язык в вашей версии cmake (iirc был добавлен в cmake 3.9). Однако поддержка CUDA по умолчанию не включается при создании нового проекта.

Если ваш проект определен как project(my_project_name), просто укажите языки, которые вы там используете, например, project(my_objrect_name C CUDA). Затем cmake будет использовать компилятор nvidia для компиляции любого файла с расширением .cu

...