【问题标题】:CUDA C++ Linking error undefined reference threadIdx.xCUDA C++ 链接错误未定义参考threadIdx.x
【发布时间】:2023-03-05 20:49:01
【问题描述】:

您好,尝试在 CUDA 上并行化格子玻尔兹曼求解器。 不知何故,在将目标文件链接在一起时出现错误。对象编译没有错误。

LBMSolver.o:在函数中 >LBMSolver::calcMoments_GPU(LBMUniformGrid2D::LBMGridNode**, int)': tmpxft_00004b33_00000000-3_LBMSolver.cudafe1.cpp:(.text+0x939): undefined >reference toblockDim' tmpxft_00004b33_00000000-3_LBMSolver.cudafe1.cpp:(.text+0x93f): undefined >reference to blockIdx' tmpxft_00004b33_00000000-3_LBMSolver.cudafe1.cpp:(.text+0x948): undefined >reference tothreadIdx' tmpxft_00004b33_00000000-3_LBMSolver.cudafe1.cpp:(.text+0x953): undefined >reference to blockDim' tmpxft_00004b33_00000000-3_LBMSolver.cudafe1.cpp:(.text+0x959): undefined >reference toblockIdx' tmpxft_00004b33_00000000-3_LBMSolver.cudafe1.cpp:(.text+0x962): undefined >reference to `threadIdx'

这是我的 Makefile:

OBJS = main.o LBMSolver.o LBMUniformGrid2D.o LBMBoundaryConditions.o   writeVTK.o
CC = g++
NVCC = nvcc
CFLAGS = -Wall -c 
LFLAGS = -Wall
XCOMPILER = -Xcompiler "-Wall"
NVCFLAGS = -c -G -g -ccbin=$(CC) $(XCOMPILER)
NVLFLAGS = -G -g -ccbin=$(CC) $(XCOMPILER)


main : $(OBJS)
    $(NVCC) $(NVLFLAGS) $(OBJS) -o main 

main.o : main.cu LBMSolver.h writeVTK.h
    $(NVCC) $(NVCFLAGS) main.cu

LBMSolver.o : LBMSolver.cu LBMSolver.h LBMUniformGrid2D.h LBMBoundaryConditions.h
    $(NVCC) $(NVCFLAGS) LBMSolver.cu

LBMBoundaryConditions.o : LBMBoundaryConditions.cu LBMBoundaryConditions.h LBMSolver.h
    $(NVCC) $(NVCFLAGS) LBMBoundaryConditions.cu

LBMUniformGrid2D.o : LBMUniformGrid2D.cpp LBMUniformGrid2D.h
    $(CC) $(CFLAGS) LBMUniformGrid2D.cpp

writeVTK.o : writeVTK.h writeVTK.cpp
    $(CC) $(CFLAGS) writeVTK.cpp

clean_obj: 
    \rm *.o main

给出错误的函数和头文件:

#pragma once
#include "LBMUniformGrid2D.h"
#include <cuda.h>

#ifdef __CUDACC__
#define CUDA_HOSTDEV __host__ __device__
#else
#define CUDA_HOSTDEV
#endif

class LBMSolver{
...
CUDA_HOSTDEV void calcMoments_GPU(LBMUniformGrid2D::LBMGridNode **field, int nx);

__host__ __device__ void LBMSolver::calcMoments_GPU(LBMUniformGrid2D::LBMGridNode **field, int nx){
    int x = blockDim.x * blockIdx.x + threadIdx.x;
    int y = blockDim.y * blockIdx.y + threadIdx.y;

    LBMUniformGrid2D::LBMGridNode *node;
    node = field[x+y*nx];
    calc_rho_GPU(node);
    calc_ux_GPU(node);
    calc_uy_GPU(node);
    calc_v_GPU(node);
}

【问题讨论】:

    标签: c++ cuda linker-errors


    【解决方案1】:

    您不能将包含设备代码的函数定义为__host__,因为主机代码不支持特定于设备的功能。删除它,事情可能会正确编译。

    【讨论】:

    • 可能还想用__device__(仅)替换原型上的CUDA_HOSTDEV宏。
    • @RobertCrovella;至少在显示的代码中,它没有在定义中使用,所以它可能是安全的,但是是的,我认为这段代码需要认真重构。
    • 谢谢大家。我只是这样做了,它现在正在工作。我还重写了宏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    相关资源
    最近更新 更多