zoukankan      html  css  js  c++  java
  • 《GPU高性能编程CUDA实战中文》中第四章的julia实验

    在整个过程中出现了各种问题,我先将我调试好的真个项目打包,提供下载

     1 /*
     2 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
     3 *
     4 * NVIDIA Corporation and its licensors retain all intellectual property and
     5 * proprietary rights in and to this software and related documentation.
     6 * Any use, reproduction, disclosure, or distribution of this software
     7 * and related documentation without an express license agreement from
     8 * NVIDIA Corporation is strictly prohibited.
     9 *
    10 * Please refer to the applicable NVIDIA end user license agreement (EULA)
    11 * associated with this source code for terms and conditions that govern
    12 * your use of this NVIDIA software.
    13 *
    14 */
    15 
    16 #include <GLglut.h>
    17 #include "cuda.h"
    18 #include "cuda_runtime.h"
    19 #include "device_launch_parameters.h"
    20 #include "../common/book.h"
    21 #include "../common/cpu_bitmap.h"
    22 
    23 #define DIM 1000
    24 
    25 struct cuComplex {
    26     float   r;
    27     float   i;
    28     __device__ cuComplex(float a, float b) : r(a), i(b)  {}
    29     __device__ float magnitude2(void) {
    30         return r * r + i * i;
    31     }
    32     __device__ cuComplex operator*(const cuComplex& a) {
    33         return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
    34     }
    35     __device__ cuComplex operator+(const cuComplex& a) {
    36         return cuComplex(r + a.r, i + a.i);
    37     }
    38 };
    39 
    40 __device__ int julia(int x, int y) {
    41     const float scale = 1.5;
    42     float jx = scale * (float)(DIM / 2 - x) / (DIM / 2);
    43     float jy = scale * (float)(DIM / 2 - y) / (DIM / 2);
    44 
    45     cuComplex c(-0.8, 0.156);
    46     cuComplex a(jx, jy);
    47 
    48     int i = 0;
    49     for (i = 0; i<200; i++) {
    50         a = a * a + c;
    51         if (a.magnitude2() > 1000)
    52             return 0;
    53     }
    54 
    55     return 1;
    56 }
    57 
    58 __global__ void kernel(unsigned char *ptr) {
    59     // map from blockIdx to pixel position
    60     int x = blockIdx.x;
    61     int y = blockIdx.y;
    62     int offset = x + y * gridDim.x;
    63 
    64     // now calculate the value at that position
    65     int juliaValue = julia(x, y);
    66     ptr[offset * 4 + 0] = 255 * juliaValue;
    67     ptr[offset * 4 + 1] = 0;
    68     ptr[offset * 4 + 2] = 0;
    69     ptr[offset * 4 + 3] = 255;
    70 }
    71 
    72 // globals needed by the update routine
    73 struct DataBlock {
    74     unsigned char   *dev_bitmap;
    75 };
    76 
    77 int main(void) {
    78     DataBlock   data;
    79     CPUBitmap bitmap(DIM, DIM, &data);
    80     unsigned char    *dev_bitmap;
    81 
    82     HANDLE_ERROR(cudaMalloc((void**)&dev_bitmap, bitmap.image_size()));
    83     data.dev_bitmap = dev_bitmap;
    84 
    85     dim3    grid(DIM, DIM);
    86     kernel << <grid, 1 >> >(dev_bitmap);
    87 
    88     HANDLE_ERROR(cudaMemcpy(bitmap.get_ptr(), dev_bitmap,
    89         bitmap.image_size(),
    90         cudaMemcpyDeviceToHost));
    91 
    92     HANDLE_ERROR(cudaFree(dev_bitmap));
    93 
    94     bitmap.display_and_exit();
    95 }

     期间出现的问题:

    问题一

    calling a host function("cuComplex::cuComplex") from a __device__/__global__ function("julia") is not allowed
    calling a host function("cuComplex::cuComplex") from a __device__/__global__ function("julia") is not allowed
    calling a host function("cuComplex::cuComplex") from a __device__/__global__ function("cuComplex::operator *") is not allowed
    calling a host function("cuComplex::cuComplex") from a __device__/__global__ function("cuComplex::operator +") is not allowed

    这个原因是在原著中提供的代码有问题,原著中结构体中的代码为

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

     将其修改如下即可:

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

    问题二

    error LNK2019: 无法解析的外部符号 ___glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用 1>GEARS.obj : error LNK2019: 无法解析的外部符号 ___gl

    这个原因是我的OpenGL文件没有引对

    #include <GLglut.h>

    其中glut.h文件要在下面的路径下

    C:Program Files (x86)Microsoft Visual Studio 12.0VCincludeGL

    如果GL文件夹不在,要手动创建,结构如下图所示:

    注意:

    为了运行示例代码,需要抽取可运行的部分,同时为了减少手动修改的麻烦,也要注意各各个文件目录的层次关系,我的截图如下:

    千辛万苦走下来就为了下面这张图: 

    确实挺好看的。赞一个!

     

  • 相关阅读:
    Vue props向子组件中传递数据
    Vue 组件间的通信
    vue slot插槽
    Vue 组件化注意事项
    VUE多个组件示例
    Vue组件化开发
    Vue 获取当前时间并格式化
    VUE 过滤器以及插件
    Vue 表单数据双向绑定 v-mode
    VUE 事件修饰符以及按键码
  • 原文地址:https://www.cnblogs.com/liangliangdetianxia/p/3984761.html
Copyright © 2011-2022 走看看