无法将vec3作为参数传递给CUDA内核

问题描述 投票:-1回答:1

对于CUDA来说,我是一个非常陌生的人,我一直在尝试制作一个简单的光线跟踪器,但是我遇到了一个奇怪的问题,在该问题中,将glm :: vec3变量传递给内核实际上并没有复制vec3我想要它。当我使用#define GLM_FORCE_CUDA时,我收到一条奇怪的错误消息,说“ glm需要CUDA 7.0或更高版本”,因此我跟踪了该错误,显然nvcc并未定义cuda版本,因此我添加了一个include <cuda.h>在我的文件中,似乎可以使错误消失,但我仍然认为我的问题与此有关,因为我尝试将glm :: vec3发送到另一个项目中的内核并且没有问题。无论如何,这是内核:

__global__ void render(unsigned char* pix_buff_loc, int max_x, int max_y, glm::vec3 lower_left_corner, glm::vec3 horizontal, glm::vec3 vertical, glm::vec3 origin) {
    int i = threadIdx.x + blockIdx.x * blockDim.x;
    int j = threadIdx.y + blockIdx.y * blockDim.y;
    if ((i >= max_x) || (j >= max_y)) return;
    int pixel_index = j * max_x * 4 + i * 4;
    float u = i / max_x;
    float v = j / max_y;
    ray r1(origin, lower_left_corner + u * horizontal + v * vertical);
    vec3 dir = glm::normalize(r1.get_direction());
    float t = 0.5f * (dir.y + 1.0f);
    vec3 col = (float)(1.0 - t) * vec3(1.0, 1.0, 1.0) + t * vec3(0.5, 0.7, 1.0);
    unsigned char r = (int)(255 * col.x);
    unsigned char g = (int)(255 * col.y);
    unsigned char b = (int)(255 * col.z);
    vec3 v1(1750, 0, 255);
    pix_buff_loc[pixel_index + 0] = (int)v1.x;
    pix_buff_loc[pixel_index + 1] = (int)v1.y;
    pix_buff_loc[pixel_index + 2] = (int)v1.z;
    pix_buff_loc[pixel_index + 3] = 255;
}

这就是我所说的内核:

glm::vec3 lower_left_corner(-2.f, -1.f, -1.f);
    glm::vec3 horizontal(4.f, 0.f, 0.f);
    glm::vec3 vertical(0.f, 2.f, 0.f);
    glm::vec3 origin(0.f, 0.f, 0.f);
    render << <blocks, threads >> > (out_data, width, height, lower_left_corner, horizontal, vertical, origin); 

我已在内核中放置一个断点,以使用nsight调试器检查值,这是我得到的结果:the inspector says unexpected

而且我也不知道这是否相关,但是,ray类构造函数具有__device__说明符,因此我在项目的属性中启用了可重定位的代码。构建输出中没有错误消息,那我要去哪里错了?

visual-studio cuda nvidia glm-math
1个回答
0
投票

我刚刚下载了最新版本的glm,但是这次我没有在项目中包含文件,问题消失了

© www.soinside.com 2019 - 2024. All rights reserved.