我正在尝试使用CUDA为OpenGL应用程序编译代码。这是我的密码。
#include <cuda_runtime.h>
#include <cuda_gl_interop.h>
#include <device_launch_parameters.h>
float t = 0.0f; //timer
float3* device; //pointer to memory on the device (GPU VRAM)
GLuint buffer; //buffer
__global__ void demo(int * d_a)
{
int a=blockDim.x * blockIdx.x + threadIdx.x;
}
我收到一个错误
/usr/bin/ld: CMakeFiles/MatchSlide.dir/main.cpp.o: in function `demo(void*)':
main.cpp:33: undefined reference to `blockDim'
/usr/bin/ld: main.cpp:33: undefined reference to `blockIdx'
/usr/bin/ld: main.cpp:33: undefined reference to `threadIdx'
同样在CMakeFile中,我定义了
# Look for Truetype && libpng
find_package(Freetype REQUIRED)
include_directories(${FREETYPE_INCLUDE_DIRS})
pkg_check_modules(PNG REQUIRED libpng)
include_directories(${PNG_INCLUDE_DIRS})
find_package(CUDA REQUIRED)
include_directories("${CUDA_INCLUDE_DIRS}")
set(CMAKE_CXX_FLAGS "-std=c++14 -Wall -lcurand -lglfw -lGLEW -lGLU -lGL -lglut -lfreetype -lpng -lpthread -lX11 -L/usr/local/cuda/lib64 -lcudart -lcuda")
/**
* User:Demo
* Date: 30/4/20.
* Sample Project
*/
// Headers
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include "Event.h"
#include "ResourceManager.h"
#include <cstdio>
#include <cstring>
#include <cuda_runtime.h>
#include <cuda_gl_interop.h>
#include <device_launch_parameters.h>
float t = 0.0f; //timer
float3* device; //pointer to memory on the device (GPU VRAM)
GLuint buffer; //buffer
__global__ void rendering(float3 *output,float k)
{
int a=blockDim.x * blockIdx.x + threadIdx.x;
}
正如您在我的代码中看到的,我正试图定义一个简单的线程函数来运行我的代码。但正是生成的错误帮助我找出了在应用程序中定义Cuda的错误所在。
请阅读此处nvcc支持的文件扩展名。如果源文件同时包含主机代码和设备函数,那么它就不再只是一个C++源文件。我能想到的三种解决方案:
1-将main.cpp
更改为main.cu
。但是,如果您真的不想将main.cpp
更改为main.cu
(不确定原因(,请考虑以下两个选项:
2-在扩展名为cu
、的辅助文件中包含内核demo
3-使用选项x cu
按原样编译.cpp
文件,如:
nvcc main.cpp -x cu
这样,即使扩展名为cpp
,编译器也会强制将main.cpp
文件视为CUDA源文件。