Arrays 大量的0';使用cudaMemcpy()时收到的
我刚刚开始学习CUDA,我想用随机数填充一个数组(表示为1D数组的2D数组)。为了生成随机数,我跟随了另一篇文章,但我不知道数字的生成是否有问题,也不知道从设备中恢复的内存是否有问题。问题是,尽管我试图用正在发送它的线程的id填充数组的任何单元格,以便在复制到主机内存后查看结果,但在使用Arrays 大量的0';使用cudaMemcpy()时收到的,arrays,parallel-processing,cuda,gpu,Arrays,Parallel Processing,Cuda,Gpu,我刚刚开始学习CUDA,我想用随机数填充一个数组(表示为1D数组的2D数组)。为了生成随机数,我跟随了另一篇文章,但我不知道数字的生成是否有问题,也不知道从设备中恢复的内存是否有问题。问题是,尽管我试图用正在发送它的线程的id填充数组的任何单元格,以便在复制到主机内存后查看结果,但在使用cudaMemcpy()恢复数据后,我收到一个数组,该数组在任何位置都填充了0 我正在Visual Studio 2013上编程,使用cuda 7.5,使用i5 2500k作为处理器和960 GTX图形卡 这里是
cudaMemcpy()
恢复数据后,我收到一个数组,该数组在任何位置都填充了0
我正在Visual Studio 2013上编程,使用cuda 7.5,使用i5 2500k作为处理器和960 GTX图形卡
这里是我尝试填充它的主要部分和方法。我也会更新cuRand初始化。如果你需要看别的东西,就告诉我
__global__ void setup_cuRand(curandState * state, unsigned long seed)
{
int id = threadIdx.x;
curand_init(seed, id, 0, &state[id]);
}
__global__ void poblar(int * adn, curandState * state){
curandState localState = state[threadIdx.x];
int random = curand(&localState);
adn[threadIdx.x] = random;
// It doesn't mind if i use the following instruction, the result is a lot of 0's
//adn[threadIdx.x] = threadIdx.x;
}
int main()
{
const int adnLength = NUMCROMOSOMAS * SIZECROMOSOMAS; // 256 * 128 (32.768)
const size_t adnSize = adnLength * sizeof(int);
int adnCPU[adnLength];
int * adnDevice;
cudaError_t error = cudaSetDevice(0);
if (error != cudaSuccess)
exit(-EXIT_FAILURE);
curandState * randState;
error = cudaMalloc(&randState, adnLength * sizeof(curandState));
if (error != cudaSuccess){
cudaFree(randState);
exit(-EXIT_FAILURE);
}
//Here is initialized cuRand
setup_cuRand <<<1, adnLength >> > (randState, unsigned(time(NULL)));
error = cudaMalloc((void **)&adnDevice, adnSize);
if (error == cudaErrorMemoryAllocation){// cudaSuccess){
cudaFree(adnDevice);
cudaFree(randState);
printf("\n error");
exit(-EXIT_FAILURE);
}
poblar <<<1, adnLength >>> (adnDevice, randState);
error = cudaMemcpy(adnCPU, adnDevice, adnSize, cudaMemcpyDeviceToHost);
//After here, for any i, adnCPU[i] is 0 and i cannot figure what is wrong
if (error == cudaSuccess){
for (int i = 0; i < NUMCROMOSOMAS; i++){
for (int j = 0; j < SIZECROMOSOMAS; j++){
printf("%i,", adnCPU[(i*SIZECROMOSOMAS) + j]);
}
printf("\n");
}
}
return 0;
}
\uuuuu全局\uuuuuu无效设置\u cuRand(curandState*状态,未签名长种子)
{
int id=threadIdx.x;
curand_init(seed、id、0和state[id]);
}
__全局无效poblar(int*adn,curandState*state){
curandState localState=state[threadIdx.x];
int random=curand(&localState);
adn[threadIdx.x]=随机;
//我不介意使用下面的指令,结果是很多0
//adn[threadIdx.x]=threadIdx.x;
}
int main()
{
常量int adnLength=NUMCROMOSOMAS*SIZECROMOSOMAS;//256*128(32.768)
常数size\u t adnSize=adnLength*sizeof(int);
国际adnCPU[adnLength];
内部设备;
cudaError\u t error=cudaSetDevice(0);
如果(错误!=cudaSuccess)
退出(-exit_故障);
库兰州立大学*randState;
错误=cudamaloc(&randState,adnLength*sizeof(curandState));
如果(错误!=cudaSuccess){
库达弗里(兰德州立大学);
退出(-exit_故障);
}
//这是库兰德
设置存储(随机状态,未签名(时间(空));
错误=cudamaloc((void**)和adnDevice,adnSize);
if(error==cudaerrormoryallocation){//cudaSuccess){
库达弗里(adnDevice);
库达弗里(兰德州立大学);
printf(“\n错误”);
退出(-exit_故障);
}
波布拉尔(兰德斯塔州阿德副总统);
错误=cudaMemcpy(adnCPU、adnDevice、adnSize、cudaMemcpyDeviceToHost);
//在这里之后,对于任何i,adnCPU[i]都是0,我无法判断出哪里出了问题
如果(错误==cudaSuccess){
对于(int i=0;i
解决答案后编辑:给出的答案有一个特殊性,那就是你需要更少的线程数(该数量的一半对我有效)为了正确地使用cuRand对随机数进行种子设定。出于某种原因,我可以完美地创建线程,但无法为伪随机算法生成器进行种子设定。硬件上每个块的最大线程数为1024,因此,如果adnLength大于1024,则可能无法使用adnLength安排调用 您遇到的错误很可能是一个调用配置错误,它是在任何GPU工作之前,在三角括号调用之后返回的。事实上,cudaMemcpy可能不会返回它,即使它从以前的异步调用返回错误
可能出现的错误是cudaErrorLaunchOutOfResources。为了解决这个问题,我刚刚运行了256个线程并循环了128次,它真的很有效。非常感谢。我初始化cuRand的方式有什么问题吗?我获得的数字对于每个线程都是相同的。你应该设置一个种子方案,使每个线程发出不同的命令值。您对子序列的概念很感兴趣。深入研究curand文档,如果您仍然卡住,可能会发布另一个问题。问题是另一个问题。出于某种原因,我的
curand
只能使用最大线程数量的一半来运行(1024
线程是我的最大值,所以512
线程),因为当更多线程正在运行时,cuRand
中的伪随机生成器仅使用0作为种子。此问题中的代码不完整,无法编译或运行。(现在已修改)您要问的问题只能通过查看setup\u cuRand
的代码来明确回答。但请不要将此问题编辑到与已接受的答案不再相关的程度。如果您可以回答一个关于种子设定和初始化cuRand生成器的问题,请务必提问。但请在新问题中提问。这不是您的个人帮助线程,它是一个问答对,旨在对每个人都有用,而不仅仅是对您。@Talonmes如果我没有按照正确的方法解决我的错误,那就很抱歉了。我在代码中遇到了另一个小问题,并在有人使用代码之前通知了它。之后,我找到了解决方案并发布了。我将更改代码最后一次标题,因为前一次标题与我最终遇到的问题(我不知道那是什么)最相关。如果我的行为可能会损害社区的学习,我想向大家道歉。