【发布时间】:2014-09-08 09:35:59
【问题描述】:
我有一个包含两个常量浮点数组的 CUDA 头文件 (.cuh)。有两个文件包含此标头,一个是尝试复制到此常量内存的 CPP 文件,另一个是尝试使用此常量内存的 CUDA 文件。这三个文件都在一个项目中,应该编译成一个 DLL。
我尝试使用以下代码简化事情:
obj1.cuh
#pragma once
__constant__ float d_array1[5];
__constant__ float d_array2[5];
obj1.cu
#include "obj1.cuh"
//do random stuff
__global__ void kernel(float * d_array1, float * d_array2) {
int id = threadIdx.x;
float sum = d_array1[i] + d_array2[i];
}
ext.cpp
#include "obj1.cuh"
void function(float * array1, float * array2) {
cudaMemcpyToSymbol(d_array1, array1, sizeof(float)*5);
cudaMemcpyToSymbol(d_array2, array2, sizeof(float)*5);
kernel<<<1,5>>>(d_array1,d_array2);
}
构建失败并输出以下错误:
1>ext.obj : error LNK2005: "float * d_array1" (?d_array1@@3PAMA) already defined in obj1.cu.obj
1>ext.obj : error LNK2005: "float * d_array2" (?d_array2@@3PAMA) already defined in obj1.cu.obj
在你问之前,是的,我曾经尝试过使用包含保护而不是编译指示,但它仍然输出相同的错误。
包含 obj1.cuh 的保护版本
#ifndef CONSTANTARRAYS
#define CONSTANTARRAYS
__constant__ float d_array1[5];
__constant__ float d_array2[5];
#endif
【问题讨论】: