首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何绘制2048 * 2048的图像?

如何绘制2048 * 2048的图像?
EN

Stack Overflow用户
提问于 2017-06-16 03:28:51
回答 1查看 118关注 0票数 0

我正在用Cuda C做分形,我已经为1024 * 1024的图像编写了程序,但是我想要一个更大的2048 * 2048的图像,我遇到了一些问题:图像映射如何帮助我把我的两个代码1024 * 1024和我想要做的事情

代码语言:javascript
复制
#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);
}

很好地做映射,例如只更改几行

代码语言:javascript
复制
#define N 2048
dim3 bloques (45,45);
mul<<<bloques, 1>>>(matriz_dev_a);

考虑一下在每个块中发送一个线程,但是当运行不起任何作用时,我需要考虑一下映射可能是什么样子。我的英语很抱歉,晚上好,我希望对你说声谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-16 04:14:55

当前代码有两个问题。

  1. 代码是不可缩放的,因为块的数目是固定的。
  2. 内核内不正确的索引。全局索引j不随块数的变化而缩放。

解决这些问题的办法如下:

使块数动态,即取决于输入数据大小:

代码语言:javascript
复制
dim3 threads(32,32);
dim3 bloques;
bloques.x = (N + threads.x - 1)/threads.x;
bloques.y = (N + threads.y - 1)/threads.y;

将内核内的索引标准化:

代码语言:javascript
复制
int i= blockIdx.y * blockDim.y + threadIdx.y;
int j= blockIdx.x * blockDim.x + threadIdx.x;

修改后的代码在分形大小2048x2048上工作得很好。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44580324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档