【发布时间】:2015-11-01 07:36:26
【问题描述】:
我试图做的是修改一个驻留在映射内存中的变量,这会导致主程序退出。
但不是这个,主程序一直在while (var == 0) ; 行上旋转。我不知道如何刷新新值,以便它在主机端也可见。
顺便说一句。该变量在任何地方都声明为volatile,我尝试使用__threadfence_system() 函数但没有成功。
主机->设备方向效果很好。
系统:Windows 7 x64,驱动程序 358.50,GTX 560
这是我无法工作的一段代码:
static void handleCUDAError(cudaError_t err, const char *file, int line)
{
if (err != cudaSuccess) {
printf("%s in %s at line %d\n", cudaGetErrorString(err), file, line);
exit(EXIT_FAILURE);
}
}
#define CUDA_ERROR_CHECK(err) (handleCUDAError(err, __FILE__, __LINE__ ))
__global__ void echoKernel(volatile int* semaphore)
{
*semaphore = 1;
__threadfence_system();
}
int main()
{
CUDA_ERROR_CHECK(cudaSetDevice(0));
CUDA_ERROR_CHECK(cudaSetDeviceFlags(cudaDeviceMapHost));
volatile int var = 0;
volatile int *devptr;
CUDA_ERROR_CHECK(cudaHostRegister((int*)&var, sizeof (int), cudaHostRegisterMapped));
CUDA_ERROR_CHECK(cudaHostGetDevicePointer(&devptr, (int*)&var, 0));
echoKernel <<< 1, 1 >>> (devptr);
while (var == 0) ;
CUDA_ERROR_CHECK(cudaDeviceSynchronize());
CUDA_ERROR_CHECK(cudaHostUnregister((int*)&var));
CUDA_ERROR_CHECK(cudaDeviceReset());
return 0;
}
【问题讨论】:
标签: cuda