宏参数不会接受参数传递(nvcc)
macro parameter won't take argument passed (nvcc)
我刚开始在 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 示例书。关于 common/book.h 中代码的一件事,HandleError 函数(我将其重命名为 CudaErrorCheck 并将其放在另一个源代码中)在头文件中定义(等效地,在我的 [=45 中的 CudaErrorCheck 声明中) =] 。这不是不可取的吗?或者我听说过。)
间距在宏定义中很重要。你有:
#define CUDA_ERROR ( err ) (CudaErrorCheck( err, __FILE__, __LINE__ ))
你需要(最小的变化——删除一个space):
#define CUDA_ERROR( err ) (CudaErrorCheck( err, __FILE__, __LINE__ ))
对于类函数宏,宏名和宏定义参数列表的左括号之间不能有白色space。在使用宏时,宏名和参数列表的左括号之间允许有白色space。
我会写:
#define CUDA_ERROR(err) CudaErrorCheck(err, __FILE__, __LINE__)
整个展开式周围的额外括号并不是真正必要的,我不太喜欢括号周围的白色 space。不同的人对此有不同的看法,所以我只是在陈述我的偏好,而不是要求你使用它(但显然建议你考虑它)。
由于 space,您的代码扩展为如下所示:
( err ) (CudaErrorCheck( err, "addkernel.cu", 19 ))( cudaMalloc( (void **) &d_out, sizeof(float) * N ) );
和err
被诊断为未定义的标识符,使转换无效。
我刚开始在 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 示例书。关于 common/book.h 中代码的一件事,HandleError 函数(我将其重命名为 CudaErrorCheck 并将其放在另一个源代码中)在头文件中定义(等效地,在我的 [=45 中的 CudaErrorCheck 声明中) =] 。这不是不可取的吗?或者我听说过。)
间距在宏定义中很重要。你有:
#define CUDA_ERROR ( err ) (CudaErrorCheck( err, __FILE__, __LINE__ ))
你需要(最小的变化——删除一个space):
#define CUDA_ERROR( err ) (CudaErrorCheck( err, __FILE__, __LINE__ ))
对于类函数宏,宏名和宏定义参数列表的左括号之间不能有白色space。在使用宏时,宏名和参数列表的左括号之间允许有白色space。
我会写:
#define CUDA_ERROR(err) CudaErrorCheck(err, __FILE__, __LINE__)
整个展开式周围的额外括号并不是真正必要的,我不太喜欢括号周围的白色 space。不同的人对此有不同的看法,所以我只是在陈述我的偏好,而不是要求你使用它(但显然建议你考虑它)。
由于 space,您的代码扩展为如下所示:
( err ) (CudaErrorCheck( err, "addkernel.cu", 19 ))( cudaMalloc( (void **) &d_out, sizeof(float) * N ) );
和err
被诊断为未定义的标识符,使转换无效。