繁体   English   中英

CUDA-在gpu上生成数组并使用内核对其进行修改

[英]CUDA - Array Generating random array on gpu and its modification using kernel

在此代码中,im使用CUDA在gpu上生成了一维浮点数组。 数字在0和1之间。出于我的目的,我需要将它们在-1和1之间,因此我制作了简单的内核,将每个元素乘以2,然后从中减去1。 但是这里出了点问题。 当我将原始数组打印到.bmp文件中时,我得到了这个http://i.imgur.com/IS5dvSq.png (典型的噪声模式)。 但是,当我尝试使用内核修改该数组时,我得到了空白的黑色图片http://imgur.com/cwTVPTG 该程序是可执行的,但在调试中我得到了:

Midpoint_CUDA_Alpha.exe中0x75f0c41f的首次机会异常:Microsoft C ++异常:内存位置0x003cfacc的cudaError_enum。

Midpoint_CUDA_Alpha.exe中0x75f0c41f的首次机会异常:Microsoft C ++异常:内存位置0x003cfb08处的cudaError_enum。

Midpoint_CUDA_Alpha.exe中0x75f0c41f的第一个机会异常:Microsoft C ++异常:内存位置0x00000000的[rethrow]。

对于这个问题的任何帮助或什至一点点暗示,我将不胜感激。 谢谢 ! (编辑)的

#include <device_functions.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include "stdafx.h"
#include "EasyBMP.h"
#include <curand.h> //curand.lib must be added in project propetties > linker > input
#include "device_launch_parameters.h"

float *heightMap_cpu;
float *randomArray_gpu;
int randCount = 0;
int rozmer = 513;

void createRandoms(int size){
    curandGenerator_t generator;
    cudaMalloc((void**)&randomArray_gpu, size*size*sizeof(float));
    curandCreateGenerator(&generator,CURAND_RNG_PSEUDO_XORWOW);
    curandSetPseudoRandomGeneratorSeed(generator,(int)time(NULL));
    curandGenerateUniform(generator,randomArray_gpu,size*size);
}

__global__ void polarizeRandoms(int size, float *randomArray_gpu){
    int index = threadIdx.x + blockDim.x * blockIdx.x;
    if(index<size*size){
        randomArray_gpu[index] = randomArray_gpu[index]*2.0f - 1.0f;
    }
}

//helper fucnction for getting address in 1D using 2D coords
int ad(int x,int y){
    return x*rozmer+y;
}

void printBmp(){
    BMP AnImage;
    AnImage.SetSize(rozmer,rozmer);
    AnImage.SetBitDepth(24);
    int i,j;
    for(i=0;i<=rozmer-1;i++){
        for(j=0;j<=rozmer-1;j++){
            AnImage(i,j)->Red = (int)((heightMap_cpu[ad(i,j)]*127)+128);
            AnImage(i,j)->Green = (int)((heightMap_cpu[ad(i,j)]*127)+128);
            AnImage(i,j)->Blue = (int)((heightMap_cpu[ad(i,j)]*127)+128);
            AnImage(i,j)->Alpha = 0;
        }
    }
    AnImage.WriteToFile("HeightMap.bmp");
}

int main(){
    createRandoms(rozmer);
    polarizeRandoms<<<((rozmer*rozmer)/1024)+1,1024>>>(rozmer,randomArray_gpu);
    heightMap_cpu = (float*)malloc((rozmer*rozmer)*sizeof(float));
    cudaMemcpy(heightMap_cpu,randomArray_gpu,rozmer*rozmer*sizeof(float),cudaMemcpyDeviceToHost);
    printBmp();

    //cleanup
    cudaFree(randomArray_gpu);
    free(heightMap_cpu);
    return 0;
}

这是错误的:

cudaMalloc((void**)&randomArray_gpu, size*size*sizeof(float));

我们不将cudaMalloc__device__变量一起使用。 如果您进行正确的cuda 错误检查,我很确定该行将引发错误。

如果您确实想以这种方式使用__device__指针,则需要创建一个单独的普通指针cudaMalloc ,然后使用cudaMemcpyToSymbol将指针值复制到设备指针:

float *my_dev_pointer;
cudaMalloc((void**)&my_dev_pointer, size*size*sizeof(float));
cudaMemcpyToSymbol(randomArray_gpu, &my_dev_pointer, sizeof(float *));

每当您遇到CUDA程序问题时,都应进行正确的cuda错误检查。 它可能会将您的注意力集中在错误的地方。

而且,是的,内核可以访问__device__变量,而无需将该变量作为参数显式传递给内核。

编程指南介绍了__device__变量的正确用法以及应从主机访问它们的api函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM