ここでは、このチュートリアルの vadd ホストアプリケーションに必要な変更を示します。これは単なる例であり、同じ関数をインプリメントする方法はほかにもあることに注意してください。
1.必要なファイル ヘッダーを含有¶
新しい include コマンドを、既存の include コマンドと同じ場所のファイル先頭に追加します。
変更前
#include <stdlib.h> #include <fstream> #include <iostream> #include "vadd.h"
変更後
#include <stdlib.h> #include <fstream> #include <iostream> #include "vadd.h" #include "ap_int.h" #include <stdio.h>
2.新しい cl_mem バッファーを作成¶
新しく追加されたカーネル ポートからのデータと通信するため、新しいバッファーを作成します。
変更前
OCL_CHECK(err, cl::Buffer buffer_a(context, CL_MEM_READ_ONLY, size_in_bytes, NULL, &err)); OCL_CHECK(err, cl::Buffer buffer_b(context, CL_MEM_READ_ONLY, size_in_bytes, NULL, &err)); OCL_CHECK(err, cl::Buffer buffer_result(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err));
変更後
OCL_CHECK(err, cl::Buffer buffer_a(context, CL_MEM_READ_ONLY, size_in_bytes, NULL, &err)); OCL_CHECK(err, cl::Buffer buffer_b(context, CL_MEM_READ_ONLY, size_in_bytes, NULL, &err)); OCL_CHECK(err, cl::Buffer buffer_result(context, CL_MEM_WRITE_ONLY, size_in_bytes, NULL, &err)); cl::Buffer buffer_waveout(context, CL_MEM_WRITE_ONLY, 1024*sizeof(int));
3.バッファーをカーネルの新しい引数にボンディング
変更前
OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, buffer_a)); OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, buffer_b)); OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, buffer_result)); OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, DATA_SIZE));
変更後
OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, buffer_a)); OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, buffer_b)); OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, buffer_result)); OCL_CHECK(err, err = krnl_vector_add.setArg(narg++, DATA_SIZE)); krnl_vector_add.setArg(narg++,buffer_waveout);
4.ポインターへ新しいバッファーにマップ¶
変更前
OCL_CHECK(err, ptr_a = (int*)q.enqueueMapBuffer(buffer_a, CL_TRUE, CL_MAP_WRITE, 0, size_in_bytes, NULL, NULL, &err)); OCL_CHECK(err, ptr_b = (int*)q.enqueueMapBuffer(buffer_b, CL_TRUE, CL_MAP_WRITE, 0, size_in_bytes, NULL, NULL, &err)); OCL_CHECK(err, ptr_result = (int*)q.enqueueMapBuffer(buffer_result, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err));
変更後
OCL_CHECK(err, ptr_a = (int*)q.enqueueMapBuffer(buffer_a, CL_TRUE, CL_MAP_WRITE, 0, size_in_bytes, NULL, NULL, &err)); OCL_CHECK(err, ptr_b = (int*)q.enqueueMapBuffer(buffer_b, CL_TRUE, CL_MAP_WRITE, 0, size_in_bytes, NULL, NULL, &err)); OCL_CHECK(err, ptr_result = (int*)q.enqueueMapBuffer(buffer_result, CL_TRUE, CL_MAP_READ, 0, size_in_bytes, NULL, NULL, &err)); int *ptr_waveout = (int *) q.enqueueMapBuffer (buffer_waveout , CL_TRUE , CL_MAP_READ , 0, 1024*sizeof(int));
5.DDR からデータを読み出し¶
変更前
OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_result}, CL_MIGRATE_MEM_OBJECT_HOST));
変更後
OCL_CHECK(err, q.enqueueMigrateMemObjects({buffer_result}, CL_MIGRATE_MEM_OBJECT_HOST)); q.enqueueMigrateMemObjects({buffer_waveout},CL_MIGRATE_MEM_OBJECT_HOST);
6.データをファイルに保存¶
これは、すでに存在する結果の検証部分の直後に追加できます。
変更前
int match = 0; for (int i = 0; i < DATA_SIZE; i++) { int host_result = ptr_a[i] + ptr_b[i]; if (ptr_result[i] != host_result) { printf(error_message.c_str(), i, host_result, ptr_result[i]); match = 1; break; } }
変更後
int match = 0; for (int i = 0; i < DATA_SIZE; i++) { int host_result = ptr_a[i] + ptr_b[i]; if (ptr_result[i] != host_result) { printf(error_message.c_str(), i, host_result, ptr_result[i]); match = 1; break; } } FILE *fp_dout; fp_dout=fopen("wave_out.txt","w"); for (int i = 0; i < 1024; i++) { fprintf(fp_dout,"%d\n",ptr_waveout[i]<<17); } fclose(fp_dout);
7.バッファー オブジェクトをマップ¶
変更前
OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_a, ptr_a)); OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_b, ptr_b)); OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_result, ptr_result));
変更後
OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_a, ptr_a)); OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_b, ptr_b)); OCL_CHECK(err, err = q.enqueueUnmapMemObject(buffer_result, ptr_result)); q.enqueueUnmapMemObject(buffer_waveout , ptr_waveout);
ライセンス¶
Apache ライセンス、バージョン 2.0 (以下「ライセンス」) に基づいてライセンス付与されています。本ライセンスに準拠しないと、このファイルを使用することはできません。
ライセンスのコピーは、http://www.apache.org/licenses/LICENSE-2.0 から入手できます。
適切な法律で要求されるか、書面で同意された場合を除き、本ライセンスに基づいて配布されるソフトウェアは、明示的または黙示的を問わず、いかなる種類の保証または条件もなく、「現状のまま」配布されます。ライセンスに基づく権限と制限を管理する特定の言語については、ライセンスを参照してください。