julia_gpu程序编译出错

《GPU高性能编程CUDA实战》第四章中的julia_gpu程序编译不通过,改了几次还是不行,代码如下:

#include "book.h"
#include "cpu_bitmap.h"

#define DIM 1000

struct cuComplex 
{
   float   r;
   float   i;

   cuComplex( float a, float b ) : r(a), i(b)  {}

   __device__ float magnitude2( void ) 
	{
   return r * r + i * i;
   }

   __device__ cuComplex operator*(const cuComplex& a) 
	{
   return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
   }

   __device__ cuComplex operator+(const cuComplex& a) 
	{
   return cuComplex(r+a.r, i+a.i);
   }
};

__device__ int julia( int x, int y ) 
{
   const float scale = 1.5;
   float jx = scale * (float)(DIM/2 - x)/(DIM/2);
   float jy = scale * (float)(DIM/2 - y)/(DIM/2);

   cuComplex c(-0.8, 0.156);
   cuComplex a(jx, jy);

   int i = 0;
   for (i=0; i<200; i++)
	{
   a = a * a + c;

   if (a.magnitude2() > 1000)
		{
   return 0;
		}
   }

   return 1;
}

__global__ void kernel( unsigned char *ptr ) 
{
   // map from blockIdx to pixel position
   int x = blockIdx.x;
   int y = blockIdx.y;
   int offset = x + y * gridDim.x;

   // now calculate the value at that position
   int juliaValue = julia( x, y );

   ptr[offset*4 + 0] = 255 * juliaValue;
   ptr[offset*4 + 1] = 0;
   ptr[offset*4 + 2] = 0;
   ptr[offset*4 + 3] = 255;
}

// globals needed by the update routine
struct DataBlock 
{
   unsigned char   *dev_bitmap;
};

int main( void ) 
{
   DataBlock   data;
   CPUBitmap bitmap( DIM, DIM, &data );
   unsigned char    *dev_bitmap;

   HANDLE_ERROR( cudaMalloc( (void**)&dev_bitmap, bitmap.image_size() ) );
   data.dev_bitmap = dev_bitmap;

   dim3    grid(DIM,DIM);
   kernel<<<grid,1>>>( dev_bitmap );

   HANDLE_ERROR( cudaMemcpy( bitmap.get_ptr(), dev_bitmap,
   bitmap.image_size(),
   cudaMemcpyDeviceToHost ) );
   
   HANDLE_ERROR( cudaFree( dev_bitmap ) );
   
   bitmap.display_and_exit();
}

这是书中源代码,提示错误是:Error 16 error : calling a host function(“cuComplex::cuComplex”) from a device function(“julia”) is not allowed E:\CUDA\TestCUDA\Julia\Julia_GPU.cu 35
对应语句是:cuComplex c(-0.8, 0.156);

请高手帮忙,看看该如何改写?谢谢!

楼主您好,请在您的第11行前加入:

device

并重新编译贵项目。

感谢来访。

谢谢,在第11行加入__device__后确实编译通过。
但是有个问题,在Release下,可以正常编译,也能正常显示图。
但是在Debug下,也能正常编译,但是却不能显示图,有时会黑屏,没有任何反应,必须需要手动重启,有时会提示这个错误:unknown error in E://CUDA/TestCUDA/Julia/Julia_GPU.cu at line 88
同时右下角又有提示:显示器驱动程序已停止响应,并已成功恢复。
请问这是为什么呢?谢谢!

LZ您好:

“同时右下角又有提示:显示器驱动程序已停止响应,并已成功恢复。”——这表明您的计算超时了,显卡驱动进行了自动重启。
因为debug比release算的慢,所以release可能没事,但debug会超时。

请您参考论坛老帖修改TDR时间,并重启电脑应可解决。

祝您好运~

谢谢,没有在本论坛中找到关于修改TDR的帖子。
我将工程属性中的CUDA C/C+±->Device–>Generate GPU Debug Information项,由原来的Yes -G改为No,运行就可以正常显示了。不知道,这是不是与修改TDR有关呢?谢谢!

LZ您好:

修改TDR的问题在本版讨论过多次,比如:

http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6891

以及您的做法实际上是关闭了生成debug信息的选项,使得代码执行时间缩短,从而在超时之前完成计算,这个和release下不超时的道理是一样的。

以及,这个和修改TDR无关,修改TDR详细情况见上述链接。

祝您好运~

谢谢,看了你给的链接。
按照你说的,对Nsight里的配置进行了修改,如果关闭TDR,运行程序会黑屏,而且一直没有任何反应,只能强制重启,如果设置时间长一些,如100,可以正常显示。
为什么关闭TDR后,又会出现黑屏现象呢?谢谢!

LZ您好:

请确保您每次修改TDR选项后都重新启动一次电脑,再测试您的程序。

如果您的程序依然如您所说,设置为100s是可以正常运行的,但是TDR Disable时却会黑屏,那么这个似乎就不科学了,我从未遇到过这个情况,也无法给出解释。

以及欢迎您继续测试,并反馈论坛您的结果和心得。

祝您好运~

今早来后将TDR关闭,重启后,显示正常了。谢谢!

恭喜您搞定该问题,祝您好运~