CUDA by Example 第四章 julia集

但这份代码我使用的环境是VS2008,CUDA为5.5,运行后一闪而过看不到书中的图片,希望会的大佬们可以指点一下QwQ

---------------------

和书上的部分有些不同,可能是CUDA语法的问题需要在struct的构造函数前加__device__。

关于书中例子都引用的commoncpu_bitmap.h和book.h两个头文件需要从传送门下载书所对应的源码,可以直接引用example中的头文件,并且在bin和lib中有lib和exe文件需要copy到PATH中。

#include <stdio.h>
#include <string.h>
#include <Windows.h>
#include <cuda_runtime.h>
#include "E:Hifumeicuda_by_examplecommoncpu_bitmap.h"
#include "E:Hifumeicuda_by_examplecommonook.h"

#define DIM 1000 
struct cuComplex {
    float r;
    float i;
    __device__ 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) {
    int x = blockIdx.x;
    int y = blockIdx.y;
    int offset = x + y * gridDim.x;

    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;
}

int main()
{
    CPUBitmap bitmap(DIM, DIM);
    unsigned char* dev_bitmap;

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

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

    HANDLE_ERROR(cudaMemcpy(bitmap.get_ptr(), &dev_bitmap,
                            bitmap.image_size(),
                            cudaMemcpyDeviceToHost));

    bitmap.display_and_exit();
    HANDLE_ERROR(cudaFree(dev_bitmap));
    return 0;
}
原文地址:https://www.cnblogs.com/lalalatianlalu/p/13081369.html