جمع 2 وکتور با CUDA - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

جمع 2 وکتور با CUDA

0 امتیاز
سلام.

من جدید تصمیم دارم برنامه نویسی موازی را شروع کنم.قصد دارم ابتدا با مثال های ساده جلو برم؟ اگر 2 تا وکتور دارم که قصد دارم عناصر نظیر به نظیرشونو با هم جمع کنم و بریزم تو وکتور سومی .چه کارهایی باید انجام بدم؟
سوال شده آذر 7, 1393  بوسیله ی رامین قربانی (امتیاز 75)   5 11 15

1 پاسخ

+2 امتیاز

ابتدا فضای مورد نظر برای بردارهای خودتون را سمت device اشغال کرده با cudaMalloc سپس داده های موجود در 2 یردار ورودی را با تابع cudaMemcpy از host به device کپی کنید سپس در سمت device تابع مورد نظرتون که همان kernel هستش را بنویسید و در نهایت دوباره با تابع cudaMemcpy داده های خود را از device به host بر روی بردار نتیجه کپی کنید.

#define N 10
__global__ void add(int *a, int *b, int *c) {
	int tid = blockIdx.x; 
	if (tid < N)
		c[tid] = a[tid] + b[tid];
}
int main(void) {
	vector<int> a, b, c;
	int *dev_a, *dev_b, *dev_c;
	
	cudaMalloc((void**)&dev_a, N * sizeof(int));
	cudaMalloc((void**)&dev_b, N * sizeof(int));
	cudaMalloc((void**)&dev_c, N * sizeof(int));
	
	a.reserve(N);
	b.reserve(N);
	c.resize(N);
	for (int i = 0; i < N; i++) {
		a.push_back( -i);
		b.push_back( i * i);
	}
	cudaMemcpy(dev_a, &a[0], N * sizeof(int),	cudaMemcpyHostToDevice);
	cudaMemcpy(dev_b, &b[0], N * sizeof(int),	cudaMemcpyHostToDevice);
	add << <N, 1 >> >(dev_a, dev_b, dev_c);

	cudaMemcpy(&c[0], dev_c, N * sizeof(int),	cudaMemcpyDeviceToHost);
	
	for (int i = 0; i < N; i++) {
		cout << a[i] <<"+"<< b[i] << "=" << c[i];
	}
	
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c);
	return 0;
}

 

پاسخ داده شده آذر 9, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
ویرایش شده آذر 12, 1393 بوسیله ی مصطفی ساتکی
...