4

この方法で構造体を定数メモリにコピーしようとしていました:

struct Foo {
    int a, b, c;
};

__constant__ Foo cData;

int main() {
    Foo hData = {1, 2, 3};
    cudaMemcpyToSymbol(cData, &hData, sizeof(Foo));
    // ...
}

私のカーネルでは、定数データに直接アクセスできました。

__global__ void kernel() {
    printf("Data is: %d %d %d\n", cData.a, cData.b, cData.c); // 1 2 3
}

const char *しかし、シンボル名として使用しようとすると、動作が停止しました。

cudaMemcpyToSymbol("cData", &hData, sizeof(Foo)); // prints 0 0 0

どちらのバージョンも似ていると思っていましたが、間違っていたようです。

何が起こっている?

編集: cudaGetSymbolAddress でこの同じ動作を報告したいと思います。これは、noconst char *が使用されている場合に機能します。

__constant__ int someData[10];
__constant__ int *ptrToData;

int *dataPosition;
cudaGetSymbolAddress((void **)&dataPosition, someData); // Works
// cudaGetSymbolAddress((void **)&dataPosition, "someData"); // Do not work
cudaMemcpyToSymbol(ptrToData, &dataPosition, sizeof(int *));
4

2 に答える 2

11

CUDA 5 以降、シンボル名に文字列を使用することはサポートされなくなりました。これについては、こちらの CUDA 5 リリース ノートで説明されています。

・一部のAPI関数で可能だった、デバイスシンボルを表す文字列の使用はサポートされなくなりました。代わりに、シンボルを直接使用する必要があります。

この理由の 1 つは、CUDA 5 の新機能である真のデバイス リンカーの有効化に関係しています。

于 2013-03-15T15:50:14.223 に答える
3

同じエラーが何度も発生するため、この問題のほぼすべての例を示したこのサンプル コードを共有したいと思います (後で同じ間違いをしたときにここを参照できるようにします)。

//file: main.cu
#include <stdio.h>
#include <stdlib.h>
#include <cuda.h>

__constant__ float constData[256];
__device__ float devData;
__device__ float* devPointer;

int main(int argc, char **argv)
{
  cudaFree(0);

  float data[256];
  cudaError_t err = cudaMemcpyToSymbol(constData, data, sizeof(data));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));

  float value = 3.14f;
  err = cudaMemcpyToSymbol(devData, &value, sizeof(float));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));

  float* ptr;
  cudaMalloc(&ptr, 256 * sizeof(float));
  err = cudaMemcpyToSymbol(devPointer, &ptr, sizeof(ptr));
  printf("Err id: %d, str: %s\n", err, cudaGetErrorString(err));
  cudaFree(ptr);

  return EXIT_SUCCESS;
}

「無効なデバイス シンボル」と_定数_ _デバイス_メモリ使用量に関連する他の多くのメッセージが表示されました。このコードでは、実行時にそのようなエラーは発生しません。

于 2013-04-16T19:27:14.200 に答える