353
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "../book.h"
#define M 12000
#define N 12
#define O 8192
/*定义判断二元数组y中哪些项包含在二元数组x中,结果返回至z*/
/*x[M][N];y[O][N];z[O]*/
__global__ void y_in_x(int *x, int *y, int *z){
int a[M] = { 0 };
int b[N] = { 0 };
int c = 0;
int d = 0;
int e = threadIdx.x + blockIdx.x * blockDim.x;
while (e < O){
for (int i = 0; i < M; i++){
for (int j = 0; j < N; j++){
if (*((int*)x + N*i + j) == *((int*)y + N*e + j))
b[j] = 1;
else
b[j] = 0;
}
c = 0;
for (int k = 0; k < N; k++){
c = c + b[k];
}
if (c == N)
a[i] = 1;
else
a[i] = 0;
}
d = 0;
for (int l = 0; l < M; l++){
d += a[l];
}
if (d > 0)
*(z + e) = 1;
else
*(z + e) = 0;
e += blockDim.x * gridDim.x;
}
};
int main(void)
{
int *a = NULL;
int *b = NULL;
int *c = NULL;
int *dev_a = NULL;
int *dev_b = NULL;
int *dev_c = NULL;
a = (int*)malloc(M*N * sizeof(int));
b = (int*)malloc(O*N * sizeof(int));
c = (int*)malloc(O * sizeof(int));
HANDLE_ERROR(cudaMalloc((void**)&dev_a, M*N * sizeof(int)));
HANDLE_ERROR(cudaMalloc((void**)&dev_b, O*N * sizeof(int)));
HANDLE_ERROR(cudaMalloc((void**)&dev_c, O * sizeof(int)));
for (int i = 0; i < M; i++){ /*给a在CPU赋值*/
for (int j = 0; j < N; j++){
*(a + N*i + j) = i * 10 + j + 1;
}
}
for (int i = 0; i < O; i++){ /*给b在CPU赋值*/
for (int j = 0; j < N; j++){
*(b + N * i + j) = i * 10 + j + 1;
}
}
HANDLE_ERROR(cudaMemcpy(dev_a, a, M * N * sizeof(int),
cudaMemcpyHostToDevice));
HANDLE_ERROR(cudaMemcpy(dev_b, b, O * N * sizeof(int),
cudaMemcpyHostToDevice));
y_in_x << <256, 256 >> >(dev_a, dev_b, dev_c);
HANDLE_ERROR(cudaMemcpy(c, dev_c, O * sizeof(int),
cudaMemcpyDeviceToHost));
HANDLE_ERROR(cudaFree(dev_a));
HANDLE_ERROR(cudaFree(dev_b));
HANDLE_ERROR(cudaFree(dev_c));
free(a);
free(b);
free(c);
return 0;
}