Странная проблема компиляции CUDA - PullRequest
0 голосов
/ 31 августа 2018

Проект построен CMake и скомпилирован Visual Studio 2015. А код cuda скомпилирован в файл .lib с помощью команды CUDA_ADD_LIBRARY.

Код показан ниже:

//kernel.h
#pragma once
void run_kernel();

//kernel.cu
#include "kernel.h"
#include <cuda.h>
#include <cuda_runtime.h>
#include "device_launch_parameters.h"
#include<stdio.h>

__global__ void kernel1()
{
    printf("kernel1\n");
}
__global__ void kernel2()
{
    printf("kernel2\n");
}

void run_kernel()
{
    kernel1 <<<1, 1>>>();
    cudaDeviceSynchronize();
}

Ожидается, что вышеприведенный код выведет строку kernel1 в окне CMD, но вместо этого он выведет kernel2 .

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

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

Все решение включает в себя большое количество кодов и зависимостей, поэтому оно не может быть эффективно использовано совместно. Мне жаль, что эту проблему трудно воспроизвести для вас, но я застрял в этой проблеме в течение нескольких дней. Я надеюсь, что вы можете дать мне любую подсказку по этому вопросу, и я очень благодарен всем, кто видит или пишет что-то по этому вопросу. Если я немного продвинусь, я также включу это в вопрос.

1 Ответ

0 голосов
/ 03 сентября 2018

Проблема была решена.

Оказывается, в этом проекте используется опция оптимизации компилятора: / GL (оптимизация всей программы) и / LTCG. Я удалил эти опции и все правильно.

...