首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >多个.cu、.h和.c文件之间的夜间CUDA链接问题

多个.cu、.h和.c文件之间的夜间CUDA链接问题
EN

Stack Overflow用户
提问于 2020-09-11 07:02:14
回答 1查看 68关注 0票数 0

这是我第一次尝试在NSight Ubuntu中构建我的CUDA应用程序,以便从优化和分析中受益。这个应用程序在Ubuntu20(或18 ,16)中使用nvcc (makefile)在终端上运行得很好。我有多个.cu,.c和.h文件。所有文件首先包含在一个flags.h s.h文件中。我的代码从包含(有一个main()函数)文件开始,这个文件有# include“main().h”,以确保包含编译代码所需的所有文件。H也有很多#define,稍后要在不同的.cu和.c文件中使用。

然而,在NSight内部,在任何文件中都不能识别在flags.h中定义的#define参数,我得到了错误。以下是错误的屏幕截图。我将一个简单的square_array问题分成3个文件(main.cu、flags.h和square_.cu)。

我不能在NSight中构建它。谁能试着建立它,让我知道,请。任何帮助或建议都将不胜感激。

main.cu

代码语言:javascript
运行
复制
#include <stdio.h>
#include <stdlib.h>

#include "flags.h"


int main(void) {

    int i;
    int *a_h, *a_d;

    CUDA_CHECK_RETURN(cudaMalloc((void**) &a_d, sizeof(int) * WORK_SIZE));
    a_h = (int *)malloc(sizeof(int) * WORK_SIZE);        // Allocate array on host

    for (i = 0; i < WORK_SIZE; i++)
        a_h[i] = i+2.;

    int block_size = 4;
    int n_blocks = WORK_SIZE/block_size + (WORK_SIZE%block_size == 0 ? 0:1);

    sq_array<<<n_blocks, block_size>>>(a_d);

    CUDA_CHECK_RETURN(cudaGetLastError());
    CUDA_CHECK_RETURN(cudaMemcpy(a_h, a_d, sizeof(int) * WORK_SIZE, cudaMemcpyDeviceToHost));

    for (i = 0; i < WORK_SIZE; i++)
        printf("Input value: %d \n", a_h[i]  );

    CUDA_CHECK_RETURN(cudaFree((void*) a_d));
    CUDA_CHECK_RETURN(cudaDeviceReset());

    return 0;
}

flags.h

代码语言:javascript
运行
复制
#ifndef FLAGS_H_
#define FLAGS_H_

#include "square_.cu"
#define CUDA_CHECK_RETURN(value) {                                          \
    cudaError_t _m_cudaStat = value;                                        \
    if (_m_cudaStat != cudaSuccess) {                                       \
        fprintf(stderr, "Error %s at line %d in file %s\n",                 \
                cudaGetErrorString(_m_cudaStat), __LINE__, __FILE__);       \
        exit(1);                                                            \
    } }


#define WORK_SIZE 29

#endif /* FLAGS_H_ */

square_.cu

代码语言:javascript
运行
复制
__global__ void sq_array( int *a) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx< WORK_SIZE) a[idx] = a[idx] * a[idx];

}

EN

回答 1

Stack Overflow用户

发布于 2020-09-13 03:10:41

问题是你的集成开发环境正在编译square_.cu和编译main.cu,这也是在编译square_.cu,因为flags.h中的#include "square_.cu"给了你两个sq_array的定义。在编译square_.cu时,没有定义WORK_SIZE宏,这会导致编译时错误。当您在命令行上编译时,您没有编译square_.cu,因此避免了这个错误。

在任何情况下,#include .cu (或.c文件)都不是一个好主意。这些代码应该单独编译,然后链接在一起。

你必须以不同的方式组织事情。我不知道你的代码的细节,但你可以这样做:

square.cu

代码语言:javascript
运行
复制
#include "square.h"
  
__global__ void sq_array( int *a) {
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx< WORK_SIZE) a[idx] = a[idx] * a[idx];

}
   
void host_sq_array(int *a_d) {
   int block_size = 4;
   int n_blocks = WORK_SIZE/block_size + (WORK_SIZE%block_size == 0 ? 0:1);   
   sq_array<<<n_blocks, block_size>>>(a_d);
}

square.h

代码语言:javascript
运行
复制
#ifndef SQUARE_H
#define SQUARE_H

#include "flags.h"  // REMOVE #include of .cu file!!!
void host_sq_array(int *a_d);

#endif

您可以安全地使用#include square.h,它只包含常量、类型定义和函数原型。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63838717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档