【发布时间】:2015-05-05 00:46:03
【问题描述】:
我是 CUDA 的新手,并试图掌握基本知识,所以如果我问或说的事情听起来过于简单,我深表歉意。我用 C 语言编写了一些串行代码,用于生成带有随机数的数组,然后在该数组中找到最大值。
#include <stdio.h>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#define num 100000
int *arr,max = -1;
int getRand() {
double r1=rand()/(double)RAND_MAX; // Generates value between 0 & 1
return (r1 * num) + 1;
}
void generateRandom(int M) {
int i;
for(i=0;i<M;i++) {
arr[i] = getRand();
}
}
void getMax(int M) {
int i;
for(i=0;i<M;i++) {
if(arr[i] > max)
max = arr[i];
}
}
int main(int argc, char *argv[] ){
if (argc == 2) {
int M;
/* initialize random seed: */
srand (time(NULL));
M = atoi(argv[1]);
//int arr[M];
arr = (int*)calloc(M,sizeof(int));;
//printf("M = %d MAX = %d\n", M, RAND_MAX);
generateRandom(M);
getMax(M);
printf("Max value: %d",max);
}
else
printf("Invalid arguments.");
return 0;
}
我现在正在尝试将此代码转换为简单的 CUDA 程序。我尝试让 generateRandom 函数作为内核运行,但内存管理出现问题。
#include <stdio.h>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#include <cuda.h>
#define num 100000
int *arr,max = -1;
int getRand() {
double r1=rand()/(double)RAND_MAX; // Generates value between 0 & 1
return (r1 * num) + 1;
}
void generateRandom(int M) {
int i;
for(i=0;i<M;i++) {
arr[i] = getRand();
}
}
__global__ void getMax(int M) {
int i;
for(i=0;i<M;i++) {
if(arr[i] > max)
max = arr[i];
}
}
int main(int argc, char *argv[] ){
if (argc == 2) {
int M;
/* initialize random seed: */
srand (time(NULL));
M = atoi(argv[1]);
//int arr[M];
arr = (int*)calloc(M,sizeof(int));
//printf("M = %d MAX = %d\n", M, RAND_MAX);
generateRandom(M);
getMax<<<1,1>>>(M);
printf("Max value: %d",max);
}
else
printf("Invalid arguments.");
return 0;
}
该代码导致以下错误。
cudabasic.cu(23): 警告:主机变量“arr”不能直接在>设备函数中读取
cudabasic.cu(23):警告:主机变量“max”不能直接在>设备函数中读取
cudabasic.cu(24): 警告:主机变量“arr”不能直接在>设备函数中读取
cudabasic.cu(24):警告:主机变量“max”不能直接写入 > 在设备函数中
我用谷歌搜索了这个错误,发现问题在于我将全局变量传递给内核,因此设备无法读取它。根据在线建议,我尝试通过使用指针而不是传递实际变量来解决这个问题,但我仍然遇到错误。
#include <stdio.h>
#include <stdlib.h> /* srand, rand */
#include <time.h> /* time */
#include <cuda.h>
#define num 100000
int *arr,max = -1;
int getRand() {
double r1=rand()/(double)RAND_MAX; // Generates value between 0 & 1
return (r1 * num) + 1;
}
void generateRandom(int M) {
int i;
for(i=0;i<M;i++) {
arr[i] = getRand();
}
}
__global__ void getMax(int M, int *dArr, int *dMax) {
int i = threadIdx.x;
int a = dArr[i];
for(i=0;i<M;i++) {
if(a > dMax)
dMax = a;
}
}
int main(int argc, char *argv[] ){
if (argc == 2) {
int M;
/* initialize random seed: */
srand (time(NULL));
M = atoi(argv[1]);
//int arr[M];
arr = (int*)calloc(M,sizeof(int));
devArr = (int*)cudaMalloc(M,sizeof(int));
//printf("M = %d MAX = %d\n", M, RAND_MAX);
generateRandom(M);
getMax<<<1,1>>>(M, arr, max);
printf("Max value: %d",max);
}
else
printf("Invalid arguments.");
return 0;
}
cudabasic.cu(24):错误:操作数类型不兼容(“int”和“int *”)
cudabasic.cu(25):错误:“int”类型的值不能分配给“int *”类型的>实体
有人能给我指出如何最好地做到这一点的正确方向吗?
我是 CUDA 的新手,并试图掌握基本知识,所以如果我问或说的事情听起来过于简单,我深表歉意。
【问题讨论】:
标签: c arrays cuda max reduction