1

__constant__CUDAポインター (割り当て、copyToSymbol、copyFromSymbol など)を操作するためのヘルパー関数をいくつか作成しました。talonmies here で提案されているように、エラーチェックも実施しています。基本的な作業例を次に示します。

#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;
}

これを nvcc でコンパイルすると、次の警告が表示されます。

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*’

警告の意味は理解できますが、それがどこから来ているのか、一生わかりません。allocateCudaConstantテンプレート関数を作成しないと、警告は表示されません。でラップcudaMemcpyToSymbolcudaTryないと、警告も表示されません。私はそれが単なる警告であることを知っており、コンパイルすると-Wno-write-strings警告を抑制することができます。コードは正常に実行されますが、警告を無視する習慣を身に付けたくありません。警告を抑制すると、対処する必要のある他の問題が隠れてしまう可能性があります。

それで、警告がどこから来ているのか、どうすればそれを抑えることができるのかを誰かが教えてくれますか?

4

1 に答える 1

5

の宣言で に変更char* fileします。文字列を変更する必要がないため、変更可能な文字列を要求しないでください。const char* filecudaAssert

于 2013-11-12T15:34:44.370 に答える