gpt4 book ai didi

visual-c++ - CUDA - Array 在 GPU 上生成随机数组并使用内核对其进行修改

转载 作者:行者123 更新时间:2023-12-04 04:42:06 26 4
gpt4 key购买 nike

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

First-chance exception at 0x75f0c41f in Midpoint_CUDA_Alpha.exe: Microsoft C++ exception: cudaError_enum at memory location 0x003cfacc..

First-chance exception at 0x75f0c41f in Midpoint_CUDA_Alpha.exe: Microsoft C++ exception: cudaError_enum at memory location 0x003cfb08..

First-chance exception at 0x75f0c41f in Midpoint_CUDA_Alpha.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..



我会很感激在这件事上的任何帮助或什至很少的暗示。谢谢!
(已编辑)
#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 error checking我很确定该行会引发错误。

如果你真的想使用 __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__变量,而没有将变量作为参数显式传递给内核。

programming guide涵盖了 __device__ 的正确用法变量和用于从主机访问它们的 api 函数。

关于visual-c++ - CUDA - Array 在 GPU 上生成随机数组并使用内核对其进行修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18727850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com