2017-10-28 158 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問題。最後,請提供一個完整的最小重現樣本。 –