C++ 不推荐将字符串常量转换为';字符*';在CUDA分配模板函数中

C++ 不推荐将字符串常量转换为';字符*';在CUDA分配模板函数中,c++,c,cuda,C++,C,Cuda,我制作了一些帮助函数,用于使用CUDA\uuuu常量\uuuu指针(分配、copyToSymbol、copyFromSymbol等)执行操作。根据Talonmes的建议,我也有错误检查。以下是一个基本的工作示例: #include <cstdio> #include <cuda_runtime.h> __constant__ float* d_A; __host__ void cudaAssert(cudaError_t code,

我制作了一些帮助函数,用于使用CUDA
\uuuu常量\uuuu
指针(分配、copyToSymbol、copyFromSymbol等)执行操作。根据Talonmes的建议,我也有错误检查。以下是一个基本的工作示例:

#include <cstdio>
#include <cuda_runtime.h>

__constant__ float* d_A;

__host__ void cudaAssert(cudaError_t code,
                         char* file,
                         int line,
                         bool abort=true) {
  if (code != cudaSuccess) {
    fprintf(stderr, "CUDA Error: %s in %s at line %d\n",
           cudaGetErrorString(code), file, line);
    if (abort) {
      exit(code);
    }   
  }
}

#define cudaTry(ans) { cudaAssert((ans), __FILE__, __LINE__); }

template<typename T>
void allocateCudaConstant(T* &d_ptr,
                          size_t size) {
  size_t memsize = size * sizeof(T);
  void* ptr;
  cudaTry(cudaMalloc((void**) &ptr, memsize));
  cudaTry(cudaMemset(ptr, 0, memsize));
  cudaTry(cudaMemcpyToSymbol(d_ptr, &ptr, sizeof(ptr),
                             0, cudaMemcpyHostToDevice));
}

int main() {
  size_t size = 16; 
  allocateCudaConstant<float>(d_A, size);
  return 0;
}
我明白这个警告的意思,但我一辈子都搞不清楚它是从哪里来的。如果我没有将
allocateudaconstat
作为模板函数,我就不会得到警告。如果我没有在
cudaTry
中包装
cudaMemcpyToSymbol
,我也不会得到警告。我知道这只是一个警告,如果我使用
-Wno write strings
编译,我可以抑制该警告。代码运行良好,但我不想养成忽略警告的习惯,如果我抑制警告,我可能会隐藏其他需要解决的问题


那么,有人能帮我找出警告的来源以及如何抑制它吗?

cudaAssert
的声明中将
char*file
更改为
const char*file
。您不需要修改字符串,因此不应要求提供可修改的字符串。

cudaAssert
的声明中将
char*文件更改为
const char*文件。您不需要修改字符串,因此不应要求提供可修改的字符串。

谢谢。这解决了问题。请解释一下为什么模板函数会出现此错误,但如果我显式将其设置为
float
double
函数,则不会出现此错误?@joelmeans:您将不可修改的字符串传递给一个需要可修改字符串的函数。可能添加模板会导致nvcc在没有它的情况下使用g++,gcc就足够了,在C中转换不是不推荐的吗?JoelMeal:“是的,C和C++是不同的语言,它们有不同的规则,特别是字符串相关的文字。谢谢。这解决了问题。请解释一下为什么模板函数会出现此错误,但如果我显式将其设置为
float
double
函数,则不会出现此错误?@joelmeans:您将不可修改的字符串传递给一个需要可修改字符串的函数。可能添加模板会导致nvcc在没有它的情况下使用g++,gcc就足够了,在C中转换不是不推荐的吗?JoelMeal:“JoelMeave:”没错,C和C++是不同的语言,它们有不同的规则,特别是字符串的文字。“我知道这只是一个警告”——在C++ 11中,它应该是一个错误。不可靠的转换不再被反对,它是完全不允许的。@MikeSeymour确保我现在处理它的另一个原因…假设
nvcc
很快会增加C++11兼容性。“我知道这只是一个警告”-在C++11中,它应该是一个错误。不可靠的转换不再被反对,它是完全不允许的。@MikeSeymour确保我现在处理它的另一个原因…假设
nvcc
很快会增加C++11兼容性。
In file included from tmpxft_0000a3e8_00000000-3_example.cudafe1.stub.c:2:
example.cu: In function ‘void allocateCudaConstant(T*&, size_t) [with T = float]’:
example.cu:35:   instantiated from here
example.cu:29: warning: deprecated conversion from string constant to ‘char*’