将旧cuda代码移植到7.5

将旧cuda代码移植到7.5,cuda,Cuda,与cuda 3.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 cudaMemcp

与cuda 3.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\u runtime\u api.cc
指向一个可用的用户定义的api


在注释之后,必须传递符号本身,而不是字符串中的名称。以下是如何使用此新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();
}

不用ASCII提供符号的名称,只需传递符号本身即可。对不起,我不明白。如果您的意思是我必须将
const char*symbol
更改为
const void*symbol
,那么除了传递“a”之外,这不起作用,只需传递
a
。如果您的意思是
const char symbol
,这也不起作用。对不起,我不明白你为什么用这种不寻常的方式来表达。所以,你说的是打电话的人。然而,问题似乎是另外一回事。我查了其中一个电话。在
.h
文件中,我看到
\uuuuu constant\uuuuu int jds\u ptr\u int[5000]。然后在
.cu
文件中,我看到
cudaMemcpyToSymbol(jds_ptr_int,h_ptr,depth*sizeof(int))该错误引用旧代码中的一个库文件。请参阅更新的帖子。@mahmood,您的源文件中似乎有两个相互冲突的符号声明。包含某些版本的头并用不同的签名重新声明相同的C符号将发出错误。您可能需要相应地更新源文件(用
cudaMemcpyToSymbol
注释该行)。不过,这更像是一个C/C++问题,而不是一个CUDA问题。最后,请提供完整的最小复制器示例。
#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