Проект построен 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 как отдельного проекта решения. Но он продолжает появляться.
Кроме того, я также провел несколько экспериментов и обнаружил, что проблема может заключаться в том, что название функции невозможно различить. Функции, которые будут определены позже, могут переопределять те, которые определены первыми, если их списки параметров совпадают .
Все решение включает в себя большое количество кодов и зависимостей, поэтому оно не может быть эффективно использовано совместно. Мне жаль, что эту проблему трудно воспроизвести для вас, но я застрял в этой проблеме в течение нескольких дней. Я надеюсь, что вы можете дать мне любую подсказку по этому вопросу, и я очень благодарен всем, кто видит или пишет что-то по этому вопросу. Если я немного продвинусь, я также включу это в вопрос.