2017-10-28 266 views
0

与cuda 3.5兼容的旧源代码与新的cuda版本不兼容,例如, 7.5。例如,将旧的cuda代码移植到7.5

cuda_runtime_api.cc: In function ‘cudaError_t cudaMemcpyToSymbol(const char*, const void*, size_t, size_t, cudaMemcpyKind)’: 
cuda_runtime_api.cc:556:141: error: declaration of C function ‘cudaError_t cudaMemcpyToSymbol(const char*, const void*, size_t, size_t, cudaMemcpyKind)’ conflicts with 
__host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const char *symbol, const void *src, size_t count, size_t offset, enum cudaMemcpyKind kind) 
                                     ^
In file included from cuda_runtime_api.cc:155:0: 
/usr/local/cuda/include/cuda_runtime_api.h:4335:39: error: previous declaration ‘cudaError_t cudaMemcpyToSymbol(const void*, const void*, size_t, size_t, cudaMemcpyKind)’ here 
extern __host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const void *symbol, const void *src, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyHostToDevice)); 

所以说,代码中的cudaMemcpyToSymbol()与7.5实现不兼容。源代码是

__host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const char *symbol, const void *src, size_t count, size_t offset, enum cudaMemcpyKind kind) 
{....} 

和7.5版本的/usr/local/cuda/include/cuda_runtime_api.h是

extern __host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const void *symbol, const void *src, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyHostToDevice)); 

我该如何解决呢?

更新:错误文件中的cuda_runtime_api.cc指向用户定义的错误文件here

[email protected]:~/gem5-gpu/benchmarks/libcuda$ g++ -std=c++0x -O3 -g -Wall -fPIC -DCUDART_VERSION=7050 -I./ -I/usr/local/cuda/include -I../../gem5/util/m5 -c cuda_runtime_api.cc -o cuda_runtime_api.o 
cuda_runtime_api.cc: In function ‘cudaError_t cudaMemcpyToSymbol(const char*, const void*, size_t, size_t, cudaMemcpyKind)’: 
cuda_runtime_api.cc:556:143: error: declaration of C function ‘cudaError_t cudaMemcpyToSymbol(const char*, const void*, size_t, size_t, cudaMemcpyKind)’ conflicts with 
__host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const char *symbol, const void *src, size_t count, size_t offset , enum cudaMemcpyKind kind) 
                                      ^
In file included from cuda_runtime_api.cc:155:0: 
/usr/local/cuda/include/cuda_runtime_api.h:4335:39: error: previous declaration ‘cudaError_t cudaMemcpyToSymbol(const void*, const void*, size_t, size_t, cudaMemcpyKind)’ here 
extern __host__ cudaError_t CUDARTAPI cudaMemcpyToSymbol(const void *symbol, const void *src, size_t count, size_t offset __dv(0), enum cudaMemcpyKind kind __dv(cudaMemcpyHostToDevice)); 
           ^
+2

而是提供在ASCII符号的名称,只需通过符号本身。 –

+0

对不起,我不明白。如果你的意思是我必须将'const char * symbol'改为'const void * symbol',那么这不起作用 – mahmood

+0

而不是通过\t“a”,只需传递'a'即可。 –

回答

1

在注释之后,符号本身必须被传递,而不是字符串中的名称。下面是关于如何使用这个新的API签名的说明例子:

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 

#include <stdio.h> 

__constant__ int a[1]; 

__global__ void kernel() 
{ 
    printf("a = %d\n", a[0]); 
} 

int main() 
{ 
    int value = 42; 
    cudaMemcpyToSymbol(a, &value, sizeof(int)); 
    kernel << <1, 1 >> >(); 
    return cudaDeviceSynchronize(); 
} 

应该打印

a = 42 
+0

所以你说的是来电者。但是,问题似乎是另一回事。我查了一个电话。在'.h'文件中,我看到'__constant__ int jds_ptr_int [5000];'。然后在'.cu'文件中,我看到'cudaMemcpyToSymbol(jds_ptr_int,h_ptr,depth * sizeof(int));' – mahmood

+0

错误引用旧代码中的一个库文件。请参阅更新后的帖子。 – mahmood

+1

@mahmood,你似乎在源文件中有两个冲突的符号声明。包括某些版本的头文件并用不同的签名重新声明相同的C符号将会出错。您可能需要相应地更新您的源文件(使用'cudaMemcpyToSymbol'注释该行,但这更像是一个C/C++问题,而不是CUDA问题。最后,请提供一个完整的最小重现样本。 –