bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

cuda

サンプルを弄ってみた。
CPUで配列を0に初期化してGPUに渡す。GPUでスレッドインデックスを配列に代入。
GPUバッファをCPUの配列にコピーしてGPUの処理が反映されたものを取得できる。

#include <stdio.h>

/**
 *	@brief	GPUで実行する関数.
 */
__global__
void setIndex(int* addr) {
	int x = threadIdx.x;
	addr[x] = x;
}


/**
 *	@brief	CPUのエントリー.
 *      @note   ブロック1, スレッド100
 */
int main() {
	int* buffer;		/* CPU */
	int* d_buffer;		/* GPU */

	int len = 100;
	int size = sizeof(int)*len;

	/* CPU用バッファ. */
	buffer = new int[len];
	memset(buffer, 0, size);
	/* GPU用バッファ. */
	cudaMalloc((void**)&d_buffer, size);
	/* CPU用バッファをGPU用バッファにコピー. */
	cudaMemcpy(buffer, d_buffer, size, cudaMemcpyHostToDevice);

	/* GPU関数実行前の状態. */
	printf("before\n");
	for(int i = 0; i < len; ++i) {
		printf("%d, %d\n", i, buffer[i]);
	}

	/* GPU関数実行. */
	setIndex<<<1,len>>>(d_buffer);

	/* GPU関数実行後のGPUバッファをCPUバッファにコピー. */
	cudaMemcpy(buffer, d_buffer, size, cudaMemcpyDeviceToHost);
	/* GPUバッファの開放. */
	cudaFree(d_buffer);

	/* GPUバッファ実行による変更を反映したCPUバッファになっていることを確認. */
	printf("after\n");
	for(int i = 0; i < len; ++i) {
		printf("%d, %d\n", i, buffer[i]);
	}
	/* CPUバッファ開放. */
	free(buffer);

	/* 入力待ち. */
	getchar();

	return 0;
}