2013-02-19 87 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];