Visual c++ CUDA阵列在gpu上生成随机阵列及其内核修改

Visual c++ CUDA阵列在gpu上生成随机阵列及其内核修改,visual-c++,cuda,Visual C++,Cuda,在这段代码中,我使用CUDA在gpu上生成1D浮点数组。数字介于0和1之间。出于我的目的,我需要它们介于-1和1之间,所以我制作了一个简单的内核,将每个元素乘以2,然后从中减去1。但是这里出了点问题。当我将原始数组打印到.bmp中时,我得到了这个(典型的噪声模式)。但当我试图用我的内核修改这个数组时,我得到了一张空白的黑色图片。该程序是可执行的,但在调试过程中,我得到以下信息: 中点_CUDA_Alpha.exe中0x75f0c41f处的首次机会异常: 微软C++异常:CUAAYRORGNONE

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

中点_CUDA_Alpha.exe中0x75f0c41f处的首次机会异常: 微软C++异常:CUAAYRORGNONEM在内存位置 0x003cfacc

中点_CUDA_Alpha.exe中0x75f0c41f处的首次机会异常: 微软C++异常:CUAAYRORGNONEM在内存位置 0x003Cf08

中点_CUDA_Alpha.exe中0x75f0c41f处的首次机会异常: 微软C++异常:[重新投掷]在内存位置0x00亿…< /p> 在这件事上,如果有任何帮助,哪怕是一点点暗示,我都会感激的。谢谢 (编辑)

#包括
#包括
#包括
#包括
#包括“stdafx.h”
#包括“EasyBMP.h”
#必须在项目属性>链接器>输入中添加include//curand.lib
#包括“设备启动参数.h”
浮点*高度映射\u cpu;
浮点*随机阵列\gpu;
int randCount=0;
int-rozmer=513;
void createRandoms(整数大小){
放射发生器;
cudamaloc((void**)和randomArrayGPU,size*size*sizeof(float));
curandCreateGenerator(&generator,CURAND_RNG_PSEUDO_XORWOW);
curandSetPseudoRandomGeneratorSeed(生成器,(int)时间(NULL));
curandGenerateUniform(生成器、随机阵列gpu、大小*大小);
}
__全局无效极化域(整数大小,浮点*随机数组\gpu){
int index=threadIdx.x+blockDim.x*blockIdx.x;
if(indexBlue=(int)((heightMap_-cpu[ad(i,j)]*127)+128);
动物年龄(i,j)->α=0;
}
}
AnImage.WriteToFile(“HeightMap.bmp”);
}
int main(){
createRandoms(rozmer);
偏振器域(rozmer、randomArray\gpu);
高度映射(cpu=(float*)malloc((rozmer*rozmer)*sizeof(float));
cudaMemcpy(高度映射cpu、随机阵列gpu、rozmer*rozmer*sizeof(浮点)、cudaMemcpyDeviceToHost);
printBmp();
//清理
cudaFree(随机阵列gpu);
自由(高度映射到cpu);
返回0;
}
这是错误的:

cudaMalloc((void**)&randomArray_gpu, size*size*sizeof(float));
我们不会将
cudamaloc
\uuuu设备\uuuuu
变量一起使用。如果您执行正确的cuda,我非常确定该行将抛出错误

如果确实希望以这种方式使用
\uuu设备\uuuu
指针,则需要创建一个单独的普通指针
cudamaloc
,然后使用
cudaMemcpyToSymbol
将指针值复制到设备指针:

float *my_dev_pointer;
cudaMalloc((void**)&my_dev_pointer, size*size*sizeof(float));
cudaMemcpyToSymbol(randomArray_gpu, &my_dev_pointer, sizeof(float *));
每当你的CUDA程序出现问题时,你应该做适当的CUDA错误检查。它可能会把你的注意力集中在错误的地方

而且,是的,内核可以访问
\uuuu设备\uuu
变量,而无需将变量作为参数显式传递给内核


介绍了如何正确使用
\uuuu设备\uuuuu>变量以及从主机访问变量时应使用的api函数。

如果浮点/整数转换有问题,请尝试将内核中的计算替换为:randomArray\u gpu[index]=randomArray\u gpu[index]*2.0f-1.0f;thx,但这并不能解决它:/因为
int
*
+
之前被提升为
float
,请参见.thx Jack,但它不是它。即使我离开这样写的行:randomArray\u gpu[index]=randomArray\u gpu[index];这应该让数组保持原样,结果是相同的黑色空白(全零)。@TomášTomusJavorský:请不要在问题中“修复”代码。问题的全部目的是将问题及其答案留给下一个出现的人。通过“修复”代码,您正在有效地销毁问题,并使您收到的答案无效。我已回滚您的编辑并按您的要求更正标题。请不要再次编辑代码。thx,再次,现在已修复。是的,调试输出中的这一切都是如此。绝对正确。昨天太晚了,没有足够的神经元重新工作确认指针声明前面有一个
\uuuu设备\uuuu
键:-)
float *my_dev_pointer;
cudaMalloc((void**)&my_dev_pointer, size*size*sizeof(float));
cudaMemcpyToSymbol(randomArray_gpu, &my_dev_pointer, sizeof(float *));