我内核的函数签名如下:
template< size_t S, typename Field, typename Type1, typename Type2>
void kernel(const Type1 arg1, const Type2 arg2, Field *results) {
// S is known at compile time
// Field might be float or double
// Type1 is an object holding data and also methods
// Type2 is an object holding data and also methods
// The computation start here
}
Run Code Online (Sandbox Code Playgroud)
我知道可以使用c ++的一部分功能来编写内核,使用AMD对OpenCL实现的扩展,但结果代码仅限于在AMD卡上运行.
2.0之前版本的OpenCL语言标准规范限制程序员使用C99编写内核,我相信版本2.1和2.2还没有广泛用于Linux发行版.但是,我在这里发现Boost :: compute在某种程度上允许在内核规范中使用c ++特性的子集.但是,如果可以使用Boos :: compute在上面的代码片段中实现内核签名,则不清楚.在哪种程度上可以实现这样的内核?代码示例将非常感激.
定义了如何处理错误:
static void HandleError( cudaError_t err,
const char *file,
int line ) {
if (err != cudaSuccess) {
printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
file, line );
exit( EXIT_FAILURE );
}
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
Run Code Online (Sandbox Code Playgroud)
通常,要将结果存储在类型为double的大小为N的数组d_results中,可以立即在GPU内存中分配,我们可以设法将数据从设备传输到主机,如下所示:
double *d_results;
HANDLE_ERROR(cudaMalloc(&d_results,N*sizeof(double)));
//Launch our kernel to do some computations and store the results in d_results
.....
// and transfer our data from the device to the host
vector<double> results(N);
cudaMemcpy(results.data(),d_results,N*sizeof(double),cudaMemcpyDeviceToHost);
Run Code Online (Sandbox Code Playgroud)
如果第二行失败,因为没有足够的内存来一次存储所有结果.如何设法进行计算并将结果正确传输到主机?是否必须按批次进行计算?我宁愿避免手动批处理.在CUDA中管理这种情况的标准方法是什么?
我想开始使用SYCL,但目前发现需要安装ComputeCpp,而且只支持Ubuntu、CentOS和Windows。在 MacOS Catalina 上使用 SYCL 的替代方法有哪些?