2017-06-16 3 views
0

私はCuda Cでフラクタルをやっていますが、すでに1024 * 1024の画像でプログラムを作っていましたが、2048 * 2048の大きな画像が欲しいです。画像マッピングがどのように私の2つのコード1024×1024と何が2048 * 2048のイメージをマップするにはどうすればよいですか?

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 
#include <cuda.h> 
#include <iostream> 
#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#include <ctime> 
#define MAX_ITER 5000 
#define N 1024 
#define BLOCKS 32 
#define THREAD 1 
using namespace cv; 
using namespace std; 
__global__ void mul(unsigned char *imagen){ 
int i=blockIdx.y*gridDim.x+blockIdx.x; 
int j=threadIdx.y*blockDim.x+threadIdx.x; 
    double x,y,a,b,xnew,ynew,sq; 
    double iter; 
    iter=0; 
     x=0; 
     y=0; 
     a=((3.0/(N))*j-2); 
     b=((2.0/(N))*i-1); 
     sq=abs(sqrt(pow(x,2)+pow(y,2))); 
     while((sq<2)&&(iter<MAX_ITER)) 
     { 
      xnew=((x*x)-(y*y))+a; 
      ynew=(2*x*y)+b; 
    x=xnew; 
      y=ynew;  
    sq=abs(sqrt(pow(x,2)+pow(y,2))); 
      iter=iter+1;   
     } 
     if(iter==MAX_ITER) 
     { 
      imagen[i*(N)+j]=255; 
     } 
     else 
     { 
      imagen[i*(N)+j]=0; 
     } 
} 
int main(){ 
dim3 bloques (32,32); 
dim3 threads(32,32); 
unsigned char *matriz_a; 
unsigned char *matriz_dev_a; 

matriz_a = (unsigned char *)malloc(sizeof(unsigned char) * N*N); 
cudaMalloc((void **)&matriz_dev_a, N*N*sizeof(unsigned char)); 
cudaMemcpy(matriz_dev_a, matriz_a, sizeof(unsigned char) *N*N, cudaMemcpyHostToDevice); 
/**************************************************************/ 
mul<<<bloques, threads>>>(matriz_dev_a); 
cudaMemcpy(matriz_a, matriz_dev_a, sizeof(unsigned char) *N*N, cudaMemcpyDeviceToHost); 
/**************************************************************************/ 
/************************************************************************/ 
/***********************************************************************/ 
const cv::Mat img(cv::Size(N, N), CV_8U, matriz_a); 
cv::namedWindow("foobar"); 
cv::imshow("foobar", img); 
cv::waitKey(0); 
free(matriz_a); 
cudaFree(matriz_dev_a); 
} 
のみ、各ブロック内のスレッドを送信するが、実行しているときの

#define N 2048 
dim3 bloques (45,45); 
mul<<<bloques, 1>>>(matriz_dev_a); 

だと思うが行う例えば数行を変更するマッピングを行うには良い

をやろうとしています何もしないと、マッピングがどのようなものかについて考えるのに少し費用がかかります。 私の英語のために申し訳ありません おはようございますとありがとうございます。

答えて

4

現在のコードには2つの問題があります。

  1. ブロックの数が固定されているため、コードは拡大縮小できません。
  2. カーネル内のインデックスが正しくありません。グローバルインデックスjは、ブロック数の変化に応じて縮尺変更されません。

次のような問題を解決することができます。

は、入力データのサイズにすなわち依存し、ダイナミックブロックの数を確認します:

dim3 threads(32,32); 
dim3 bloques; 
bloques.x = (N + threads.x - 1)/threads.x; 
bloques.y = (N + threads.y - 1)/threads.y; 

は、カーネル内のインデックスを標準化:

int i= blockIdx.y * blockDim.y + threadIdx.y; 
int j= blockIdx.x * blockDim.x + threadIdx.x; 

T彼は変更されたコードは、フラクタルサイズ2048 x 2048でうまく動作します。

+0

ありがとう、私はもっと勉強するつもりだと思う、私はそれを動作させるだろう ありがとうございます! –

関連する問題