gpt4 book ai didi

c - 宏参数不会接受传递的参数(nvcc)

转载 作者:行者123 更新时间:2023-11-30 14:50:56 25 4
gpt4 key购买 nike

我刚刚开始在 CUDA 上编码,我试图将我的代码管理到一堆不同的文件中,但我的一个宏由于某种原因不会接受传递的参数。

错误是:

addkernel.cu(19): error: identifier "err" is undefined

所以我的主要代码在../cbe4/addkernel.cu

#include <stdio.h>
#include <stdlib.h>

#include "cbe4.h"
#include "../mycommon/general.h"

#define N 100

int main( int argc, char ** argv ){

float h_out[N], h_a[N], h_b[N];
float *d_out, *d_a, *d_b;

for (int i=0; i<N; i++) {
h_a[i] = i + 5;
h_b[i] = i - 10;
}

// The error is on the next line
CUDA_ERROR( cudaMalloc( (void **) &d_out, sizeof(float) * N ) );
CUDA_ERROR( cudaMalloc( (void **) &d_a, sizeof(float) * N ) );
CUDA_ERROR( cudaMalloc( (void **) &d_b, sizeof(float) * N ) );

cudaFree(d_a);
cudaFree(d_b);


return EXIT_SUCCESS;
}

该宏在 ../mycommon/general.h 中定义:

#ifndef __GENERAL_H__
#define __GENERAL_H__

#include <stdio.h>

// error checking
void CudaErrorCheck (cudaError_t err, const char *file, int line);

#define CUDA_ERROR ( err ) (CudaErrorCheck( err, __FILE__, __LINE__ ))

#endif

这是 ../mycommon/general.cu 中 CudaErrorCheck 函数的源代码:

#include <stdio.h>
#include <stdlib.h>

#include "general.h"

void CudaErrorCheck (cudaError_t err,
const char *file,
int line) {
if ( err != cudaSuccess ) {
printf( "%s in %s at line %d \n",
cudaGetErrorString( err ),
file, line );
exit( EXIT_FAILURE );
}
}

../cbe/cbe4.h 是我的头文件,../cbe/cbe4.cu 是内核代码的源文件(如果这可能有帮助):

在cbe4.h中:

__global__
void add( float *, float *, float * );

在 cbe4.cu 中:

    #include "cbe4.h"

__global__ void add( float *d_out, float *d_a, float *d_b ) {
int tid = (blockIdx.x * blockDim.x) + threadIdx.x;
d_out[tid] = d_a[tid] + d_b[tid]; }

这是我的 makefile(存储在 ../cbe4 中):

NVCC = nvcc
SRCS = addkernel.cu cbe4.cu
HSCS = ../mycommon/general.cu

addkernel:
$(NVCC) $(SRCS) $(HSCS) -o $@

另外,顺便说一句,我正在使用《Cuda by Examples》一书。关于 common/book.h 中的代码的一件事是,HandleError 的函数(我将其重命名为 CudaErrorCheck 并将其放置在此处的另一个源代码中)是在头文件中定义的(等效地,在我的 generic.h 中的 CudaErrorCheck 声明中)。这不是不可取吗?至少我是这么听说的。)

最佳答案

空格在宏定义中很重要。你有:

#define CUDA_ERROR ( err ) (CudaErrorCheck( err, __FILE__, __LINE__ )) 

您需要(最小的更改 - 删除一个空格):

#define CUDA_ERROR( err ) (CudaErrorCheck( err, __FILE__, __LINE__ )) 

对于类似函数的宏,宏名称和宏定义的参数列表的左括号之间不能有空格。使用宏时,宏名称和参数列表的左括号之间允许有空格。

我会写:

#define CUDA_ERROR(err) CudaErrorCheck(err, __FILE__, __LINE__)

整个扩展周围的额外括号并不是真正必要的,而且我不太喜欢括号周围的空白。不同的人对此有不同的看法,所以我只是陈述我的偏好,而不是在任何意义上要求您使用它(但显然建议您考虑它)。

由于空间的原因,您的代码扩展如下:

( err ) (CudaErrorCheck( err, "addkernel.cu", 19 ))( cudaMalloc( (void **) &d_out, sizeof(float) * N ) );

err 被诊断为未定义的标识符,导致转换无效。

关于c - 宏参数不会接受传递的参数(nvcc),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48661899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com