我想从主机设置符号地址的符号指针。类似的东西:
__device__ float * symbolPtr; // address of symbol[3]
__device__ float symbol[5];
cudaGetSymbolAddress( &symbolPtr, symbol[3] );
我只是用它来获取主机的设备地址。但是没有提到它不能设置符号变量。
这是另一种方法:
cudaMemcpytoSymbol(&symbolPtr, &symbol[3], sizeof(void*), 0, cudaMemcpyDeviceToDevice);
我怀疑其中任何一种都可行。有更简单的方法吗?
答案 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];