1

我想从主机设置一个指向符号地址的符号指针。就像是:

__device__ float * symbolPtr;   // address of symbol[3]
__device__ float symbol[5];

cudaGetSymbolAddress( &symbolPtr, symbol[3] );

我只用它来获取主机的设备地址。但是没有提到它不能设置符号变量。

这是另一种方法:

cudaMemcpytoSymbol(&symbolPtr, &symbol[3], sizeof(void*), 0, cudaMemcpyDeviceToDevice);

我怀疑其中任何一个都行得通。有没有更简单的方法来做到这一点?

4

2 回答 2

0

这种方法对我有用。可能有更好的方法。

#include <stdio.h>
#define N 5
#define Q 3

#define cudaCheckErrors(msg) \
    do { \
        cudaError_t __err = cudaGetLastError(); \
        if (__err != cudaSuccess) { \
            fprintf(stderr, "Fatal error: %s (%s at %s:%d)\n", \
                msg, cudaGetErrorString(__err), \
                __FILE__, __LINE__); \
            fprintf(stderr, "*** FAILED - ABORTING\n"); \
            exit(1); \
        } \
    } while (0)

__device__ float *symbolPtr;
__device__ float symbol[N];

__global__ void mykernel(){

  for (int i=0; i<N; i++)
    symbol[i] = (float) i;
  printf("symbol[%d] = %f\n", Q, *symbolPtr);

}

int main(){

  float *temp;
  cudaGetSymbolAddress((void **)&temp, symbol);
  cudaCheckErrors("cudaGetSymbolAddress fail");
  temp += Q;
  cudaMemcpyToSymbol(symbolPtr, &temp, sizeof(float *));
  cudaCheckErrors("cudaMemcpyToSymbol fail");

  mykernel<<<1,1>>>();
  cudaDeviceSynchronize();
  cudaCheckErrors("kernel fail");


  return 0;
}
于 2013-02-19T23:43:08.073 回答
0

静态方法是:

__device__ float symbol[5];
__device__ float * symbolPtr= &symbol[3];
于 2013-02-20T16:46:37.853 回答