将符号地址复制到符号

时间:2013-02-19 21:59:12

标签: cuda

我想从主机设置符号地址的符号指针。类似的东西:

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

cudaGetSymbolAddress( &symbolPtr, symbol[3] );

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

这是另一种方法:

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

我怀疑其中任何一种都可行。有更简单的方法吗?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

静态方法是:

__device__ float symbol[5];
__device__ float * symbolPtr= &symbol[3];