main.cpp
#include "interactions.h"
#include //載入合適的標頭檔案
#include #include "kernel.h"
#ifdef _win32
#define windows_lean_and_mean
#define nominmax
#include #endif // _win32
#include #else
#include #include #define iters_per_render 50 //雅克比迭代次數
gluint pbo = 0;
gluint tex = 0;
struct cudagraphicsresource *cuda_pbo_resource;
void render()//創造屬於自己的cuda/opengl互操作應用程式時,唯一需要改變的就是render函式
cudagraphicsunmapresources(1, &cuda_pbo_resource, 0);
char title[128];
sprintf(title, "temperature visualizer - iterations=%4d, " "t_s=%3.0f, t_a=%3.0f, t_g=%3.0f", iterationcount, bc.t_s, bc.t_a, bc.t_g);
glutsetwindowtitle(title);
}void drawtexture()
void display()//視窗中顯示的內容
void initglut(int *argc, char **argv)
void initpixelbuffer()//初始化畫素緩衝區
void exitfunc()
cudafree(d_temp);
}int main(int argc, char** argv)
kernel.h
#pragma once
#ifndef kernel_h
#define kernel_h
struct uchar4;//防止nvcc啟動c++編譯器產生錯誤,而宣告
typedef struct //包含了所有的邊界條件資訊(包括管道的座標和半徑)
bc;void kernellauncher(uchar4 *d_out, float *d_temp, int w, int h, bc bc);
void resettemperature(float *d_temp, int w, int h, bc bc);
#endif // !kernel_h
interactions.h
#pragma once
#ifndef interactions_h
#define interactions_h
#include "kernel.h"
#include #else
#define max(x,y) (((x)>(y))?(x):(y))
#define w 640
#define h 640
#define dt 1.f
float *d_temp = 0;
int iterationcount = 0;
bc bc = ;
void keyboard(unsigned char key, int x, int y)
void mouse(int button, int state, int x, int y)
void idle(void)
void printinstructions()
#endif // !interactions_h
kernel.cu
#include "kernel.h"
#define tx 32//執行緒數
#define ty 32
#define rad 1
int divup(int a, int b) //用來計算可以覆蓋乙個計算網格的特定大小執行緒塊的數量
//確保顏色值在【0,255】範圍內
__device__ unsigned char clip(int n)
//避免超出範圍的取樣值。idxclip(i,n)返回乙個在[0,n-1]區間內的int型別值(例如乙個長度為n的陣列的合法索引)。
__device__ int idxclip(int idx, int idxmax)
__device__ int flatten(int col, int row, int width, int height)
__global__ void resetkernel(float *d_temp, int w, int h, bc bc)
//給所有點賦初始顏色黑色(完全不透明),然後將一塊(包括必要的重疊單元)已經存在的溫度值載入到共享記憶體中。
__global__ void tempkernel(uchar4 *d_out, float *d_temp, int w, int h, bc bc)
if (row == h - 1)
__syncthreads();
float temp = 0.25f*(s_in[flatten(s_col - 1, s_row, s_w, s_h)] +
s_in[flatten(s_col + 1, s_row, s_w, s_h)] +
s_in[flatten(s_col, s_row - 1, s_w, s_h)] +
s_in[flatten(s_col, s_row + 1, s_w, s_h)]);
d_temp[idx] = temp;
const unsigned char intensity = clip((int)temp);
d_out[idx].x = intensity;
d_out[idx].z = 255 - intensity;
}void kernellauncher(uchar4 *d_out, float *d_temp, int w, int h, bc bc)
void resettemperature(float *d_temp, int w, int h, bc bc)
執行結果如下:
二維陣列與二維指標
1.二維陣列的儲存是線性的,可以通過一維指標的方式訪問。如一下 int map 5 5 int mapd map 0 0 則 map i j mapd i 5 j 而利用二維陣列線性儲存的特性,可以將二維陣列當作一維指標方便的在函式之間傳遞 如 將乙個二維陣列賦值給乙個動態二維陣列,引數設定為一維指...
二維指標和二維陣列
二維指標和二維陣列有三種形式 1,type ptr 2,type ptr或者type prt 3,type prt 三種形式意思相近,也有區別。首先三種形式都能表示二維的資料結構。1,type ptr 表示乙個指向指標的指標 但是在一開始宣告的時候 type ptr ptr到底指向幾個指標是不知道的...
二維陣列與二維指標
一.指標與二維陣列 以martix 3 4 為例 1.二維陣列的本質 int martix 3 4 int martix 3 4 int 4 martix 3 令int 4 為type,type martix 3 為含有三個元素的陣列,每乙個元素型別為int 4 int 4 是乙個擁有4個int型別...