2013-02-19 90 views
1

我想从主机设置一个符号指针到符号地址。类似于:将符号地址复制到符号

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

cudaGetSymbolAddress(&symbolPtr, symbol[3]); 

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

这里是另一种方法:

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

我怀疑任何一项都将正常工作。有没有更简单的方法来做到这一点?

回答

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; 
} 
+0

感谢工作了这一点。我一直在遇到原帖的指针问题。 – Doug 2013-02-20 15:37:44

0

静态的方法是:

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