LNK2001: неразрешенный внешний символ threadIdx - PullRequest
1 голос
/ 11 февраля 2020

Я перехожу в C ++ / Cuda и столкнулся с ошибкой компиляции «неразрешенный внешний символ threadIdx» в «MortalityTable.obj».

Я создал новый проект C ++ Runtime C ++, затем компилируется и работает нормально. Затем добавили класс MortalityTable.cu и .h, без кода Cuda, просто обычный C ++. Это компилируется и работает нормально.

Ошибка начинается, когда я пытаюсь добавить ядро ​​Cuda (если я его закомментирую, все хорошо). У меня есть эти заголовки в MortalityTable.cu:

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

И это мое ядро ​​в том же файле

__global__
void DevPLE(double* devple, double* devQxt, int maxAge, int years) {
    int i = threadIdx.x;
    double surv = 0, ple = 0;
    for (int age = 0; age < maxAge; age++) {
        surv = surv * (1.0f - devQxt[age * years + i]);
        ple += surv;
    }
    devple[i] = ple + 0.5;
}

Есть идеи, как я могу заставить это скомпилировать и запустить? У меня все еще есть пример кода в kernel.cu, когда вы создаете новый Cuda Runtime Project, он имеет те же заголовки и работает. Таким образом, кажется, что настройка проекта в порядке, но по какой-то причине не работает для MortalityTable.cu ...

1 Ответ

1 голос
/ 12 февраля 2020

.cu файл скомпилирован с nv cc,. c. cpp скомпилирован с cl.

Когда в проекте cuda вы добавляете файл c ++ (cpp), но затем вы переименуете его с расширением .cu, VS также не изменит компилятор.

Если вы редактируете файл проекта project.vcxproj, вы можете проверить, что ваш файл .cu включен в CudaCompile. разметка:

  <ItemGroup>
    <CudaCompile Include="cudacode.cu" />
  </ItemGroup>
  <ItemGroup>
    <ClCompile Include="code.cpp" />
  </ItemGroup>
...