我正在使用CUDA 6.0以及与CUDA SDK捆绑在一起的OpenCL实现.我为每个平台都有两个相同的内核(它们在特定于平台的关键字中有所不同).它们只读写全局内存,每个线程的位置不同.CUDA的启动配置是200 blocks of 250 threads (1D)直接对应于OpenCL的配置50,000 global work size and 250 local work size.
OpenCL代码运行得更快.这有可能还是我错了?我的理解是NVIDIA的OpenCL实现基于CUDA的实现.使用OpenCL,我的性能提升了大约15%.
如果你可以建议我为什么会看到这个以及NVIDIA实现的CUDA和OpenCL之间的某些差异,那将会很棒?
我有以下循环来衡量我的内核的时间:
double elapsed = 0;
cl_ulong time_start, time_end;
for (unsigned i = 0; i < NUMBER_OF_ITERATIONS; ++i)
{
err = clEnqueueNDRangeKernel(queue, kernel, 1, NULL, &global, NULL, 0, NULL, &event); checkErr(err, "Kernel run");
err = clWaitForEvents(1, &event); checkErr(err, "Kernel run wait fro event");
err = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_START, sizeof(time_start), &time_start, NULL); checkErr(err, "Kernel run get time start");
err = clGetEventProfilingInfo(event, CL_PROFILING_COMMAND_END, sizeof(time_end), &time_end, NULL); checkErr(err, "Kernel run get time end");
elapsed += (time_end - time_start);
}
Run Code Online (Sandbox Code Playgroud)
然后,我把elapsed通过NUMBER_OF_ITERATIONS获得最后的估计.但是,我担心单个内核的执行时间太短,因此会给我的测量带来不确定性.如何衡量所有NUMBER_OF_ITERATIONS …
我想知道是否有一种方法可以将数据直接存储在处理器的数据缓存中,而不是存储在主内存中。我知道缓存的工作方式是存储最常用的数据,但是,有意义的是要有一个汇编指令来告诉处理器,这将是一个常用数据。我正在使用IA-32汇编语言。
谢谢!
我有关于c ++内存分配和释放的问题.情况就是这样:我有一个方法foo,它分配内存然后返回该对象:
Object foo () {
Object *a = new Object();
// Do something with this object...
return *a;
}
Run Code Online (Sandbox Code Playgroud)
和另一个使用此返回对象的方法:
void bar () {
Object a = foo();
// Do something..
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,我应该在哪个时候释放我分配的内存?当我从方法foo返回时,方法栏是否在其堆栈上获得该对象的副本,或者它是否可以访问内存中某个对象?
谢谢!巴特