CUDA by Example 第四章 julia集
但这份代码我使用的环境是VS2008,CUDA为5.5,运行后一闪而过看不到书中的图片,希望会的大佬们可以指点一下QwQ
---------------------
和书上的部分有些不同,可能是CUDA语法的问题需要在struct的构造函数前加__device__。
关于书中例子都引用的common\cpu_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:\Hifumei\cuda_by_example\common\cpu_bitmap.h" #include "E:\Hifumei\cuda_by_example\common\book.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; }