CUDAのプログラム例

GPUを用いて配列の各要素を2倍するプログラム(cuda_sample1.cu)

cuda_sample1.cu
#include<stdio.h>
#include<cutil.h>
 
const int N = 256;
 
// GPUから呼び出される関数
__global__ void VecAdd(float* A, float* B)
{
	int i = threadIdx.x;
	B[i] = A[i] * 2.0f;
}
 
int main(int argc, char* argv[])
{
	float A[N];
	float B[N];
	float *gA;
	float *gB;
	int i;
 
	// デバイスの初期化
	CUT_DEVICE_INIT(argc, argv);
 
	// ビデオメモリ上にメモリを確保
	cudaMalloc((void**)&gA, N*sizeof(float));
	cudaMalloc((void**)&gB, N*sizeof(float));
 
	// 配列を初期化
	for(i=0;i<N;i++){
		A[i] = (float)i;
	}
 
	// ホストのメモリからビデオメモリに配列をコピー
	cudaMemcpy( gA, A, N*sizeof(float), cudaMemcpyHostToDevice);
 
	// GPUでVecAddを実行(1次元、Nスレッドで実行)
	VecAdd<<<1, N>>>(gA,gB);
 
	// ビデオメモリからホストのメモリにデータをコピー
	cudaMemcpy( B, gB, N*sizeof(float), cudaMemcpyDeviceToHost);
 
	// 結果を表示
	for(i=0;i<N;i++){
		printf("%d:%f,%f\n",i,A[i],B[i]);
	}
 
	// 終了処理
	CUT_EXIT(argc, argv);
}

GPU上の演算は基本的にfloatで行うようですが、下記のように整数型でも計算できます。(動作が遅いかもしれませんが)

cuda_sample2.cu
#include<stdio.h>
#include<cutil.h>
 
const int N = 256;
 
// GPUから呼び出される関数
__global__ void VecAdd(int* A, int* B)
{
	int i = threadIdx.x;
	B[i] = A[i] * 2;
}
 
int main(int argc, char* argv[])
{
	int A[N];
	int B[N];
	int *gA;
	int *gB;
	int i;
 
	// デバイスの初期化
	CUT_DEVICE_INIT(argc, argv);
 
	// ビデオメモリ上にメモリを確保
	cudaMalloc((void**)&gA, N*sizeof(int));
	cudaMalloc((void**)&gB, N*sizeof(int));
 
	// 配列を初期化
	for(i=0;i<N;i++){
		A[i] = i;
	}
 
	// ホストのメモリからビデオメモリに配列をコピー
	cudaMemcpy( gA, A, N*sizeof(int), cudaMemcpyHostToDevice);
 
	// GPUでVecAddを実行
	VecAdd<<<1, N>>>(gA,gB);
 
	// ビデオメモリからホストのメモリにデータをコピー
	cudaMemcpy( B, gB, N*sizeof(int), cudaMemcpyDeviceToHost);
 
	// 結果を表示
	for(i=0;i<N;i++){
		printf("%d:%d,%d\n",i,A[i],B[i]);
	}
 
	// 終了処理
	CUT_EXIT(argc, argv);
}