- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在具有统一内存的 TegraK1 板上实现共轭梯度求解器。我面临的问题是在循环中我必须执行 cudaDeviceSynchronize();两次更新变量,与 TI Keystone-II 相比,这对我的性能造成了很多倍的影响,虽然 TI Keystone-II 的计算能力较低,但我只使用 Naive 代码来并行计算数据。我正在使用 CUDA 版本 - 6.0。
....
double *A, *b, *x, *x1, *r, *d, *q, deltaNew, deltaFirst, Alpha, deltaOld, Beta; // data for init processing
double *temp, *temp1, Alpha1;
b = (double *) malloc(sizeof(double)*N*1); // b original
x1 = (double *) malloc(sizeof(double)*N*1); // x1
checkCudaErrors(cudaMallocManaged(&A, sizeof(double)*N*N)); // A original
checkCudaErrors(cudaMallocManaged(&x, sizeof(double)*N*1)); // x original
checkCudaErrors(cudaMallocManaged(&r, sizeof(double)*N*1)); // r original
checkCudaErrors(cudaMallocManaged(&d, sizeof(double)*N*1)); // d original
checkCudaErrors(cudaMallocManaged(&q, sizeof(double)*N*1)); // q original
checkCudaErrors(cudaMallocManaged(&temp, sizeof(double)*1*1)); // temp of d'*q for temporary storage
checkCudaErrors(cudaMallocManaged(&temp1, sizeof(double)*1*1)); // temp1 of r'*r for temporary storage
fprintf(stderr, "\nIntializing data\n");
// Intializing all the data
setup_data(&A[0], &b[0], &x[0], &r[0], &d[0], &deltaNew, &deltaFirst);
// Get handle to the CUBLAS context
cublasHandle_t cublasHandle = 0;
cublasCreate(&cublasHandle);
fprintf(stderr, "\nData setup done.. Starting..\n");
startTime_GPU = omp_get_wtime();
while(deltaNew > (EPSI)*deltaFirst)
{
// cublasSgemm(handle, op, op, colof2, rowof1, colof1, scalar1, mat2, colof2, mat1, colof1, scalar2, result, colof2 );
cublasDgemm(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N, 1, N, N, &alpha, d, 1, A, N, &beta, q, 1); // q = A * d
cublasDgemm(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N, 1, 1, N, &alpha, q, 1, d, N, &beta, temp, 1); // alpha = deltaNew/(d' * q);
cudaDeviceSynchronize(); // POSSIBLY ELIMINATE THIS
Alpha = deltaNew/temp[0]; // alpha = deltaNew/(d' * q);
Alpha1 = (-1)*Alpha;
// cublasSaxpy(handle, N, scalar, scaledinput, stride1, inout, stride2);
cublasDaxpy(cublasHandle, N, &Alpha, d, 1, x, 1); // x = x + alpha * d
cublasDaxpy(cublasHandle, N, &Alpha1, q, 1, r, 1); // r = r - alpha * q
deltaOld = deltaNew; // deltaOld = deltaNew
cublasDgemm(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N, 1, 1, N, &alpha, r, 1, r, N, &beta, temp1, 1); // deltaNew = r' * r
cudaDeviceSynchronize(); // POSSIBLY ELIMINATE THIS
deltaNew = temp1[0];
Beta = deltaNew/deltaOld; // beta = deltaNew/deltaOld
cublasDgeam(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N, 1, N, &alpha, r, 1, &Beta, d, 1, d, 1); // d = r + beta * d
}
endTime_GPU = omp_get_wtime();
...
...
任何人都可以提出任何改进或增强建议,我可以用它来消除或减少这些改进或增强,从而提高性能。
最佳答案
在 CUDA 中,内核启动始终是异步的(即使在 CUDA 1.0 中也是如此)。当时,为了让 CUDA 内核运行,需要在设备内存之间进行显式 memcpy。 CPU/GPU 同步被隐藏,因为设备->主机 memcpy 会隐式强制执行顺序:设备->主机 memcpy 在内核完成之前无法启动。
当CPU和GPU映射相同的内存时,必须更明确地进行同步。如果没有 cudaDeviceSynchronize()
,您的 CPU 代码可能会在 GPU 写入 DGEMM 之前读取输出。托管内存在内核启动和 CPU/GPU 同步事件(例如 cudaDeviceSynchronize()
)背后实现了许多隐式策略,以简化编程。
获得 CPU/GPU 并发性并仍然正确同步的方法是通过多缓冲并将 CUDA 事件与每个缓冲区关联。在每个 DGEMM 之后调用 cudaEventRecord()
,并在使用结果之前对该事件调用 cudaEventWait()
。
talonmies 已经说过了,但值得重复:如果你想要良好的性能,你可能不得不放弃托管内存。
关于c - 尝试消除共轭梯度内核中的 cudaDeviceSynchronize(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29910338/
我创建了一个 View (称为 masterView),CGRect 的 x=160、y=186、width=1600、height=380。该 View 包含 5 个 subview ,每个 sub
我是 R 的新手,目前正在处理边缘列表形式的协作数据,该列表具有 32 列和大约 200.000 行。我想根据国家之间的相互作用创建一个(共)现矩阵。但是,我想通过对象的总数来计算交互次数。 期望结果
考虑以下发展: Require Import Relation RelationClasses. Set Implicit Arguments. CoInductive stream (A : Typ
我正在玩弄这种语言来开始学习,我对递归定义的工作原理感到困惑。 例如,让我们采用三角形数的序列(TN n = sum [1..n]) 提供的解决方案是: triangularNumbers = sca
我正在尝试获取“总分钟数”值中的 PHP“DateInterval”值。如何获得?似乎简单格式(“%i 分钟”)不起作用? 示例代码如下: $test = new \DateTime("48 hour
我有这个脚本可以通过电子邮件自动发送负载信息: if(confirm('', 'Are you sure?') == true) { // enviar mails var emails = new
我有一些数据要查询。该表由两列组成 - 一个唯一 ID 和一个值。我想计算每个唯一值出现的次数(这可以通过 COUNT 和 GROUP BY 轻松完成),但我希望能够对其进行计数。所以,我想看看有多少
当我在我的 Java 代码上运行 PMD 时,它显示的错误消息之一是“类 STWeb 具有 20 的圈复杂度”。通常我的java类是这样的 public class STWeb implements
尝试在打印时在页面底部显示第 1 页,共 10 页... 第 1 页,共 0 页 正在显示,因此计数器(页面)似乎无法正常工作。我正在使用 Chrome,所以 @pages { ... 也不起作用。有
我在尝试运行单元测试用例时收到 Executed 0 of 0 ERROR 错误。我遵循了针对此问题提到的几个解决方案,但我仍然遇到相同的错误。 尝试过: 删除 angular-scenario 文件
我们有一个应用程序,可以在运行时生成大约 100 个动画,并将它们全部添加到单个 Storyboard 中然后播放。问题是动画速度非常慢。进行动画处理的对象是形状和样条线,并且在后端完成大量计算以生成
我正在为数学演示编写凯撒加密代码。今天,我一直在为我的演讲编写代码。早上这个代码就开始工作了。但现在在学校,我遇到了一个异常(exception),我认为 for 超出了我的符号表的长度。 异常(ex
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我有一张带有 4 个标签的表格,效果很好。当我使用也能正常工作的搜索栏时,表格只显示两个标签: - (void)viewDidLoad { [super viewDidLoad]; NSS
我正在使用 iText 在我的 Java EE 应用程序中生成 PDF 文档。 PDF 文件的编码驻留在 JSP 中。 我想在每个页脚中实现以下页面格式, REF:XXXXXXX 第 X 页,共第 Y
我试图找出(出于好奇)哪个线程实际调用了单例构造函数。好吧,我完全理解每次执行测试程序时线程都会不同,只是想在实用上检查是否相同。我试过 dumpStack() printStackTrace() g
我在工作时遇到了一些麻烦。这可能真的很简单,但我让它变得比可能的更困难。所以我有一个包含 3 组 UL 的 div。 代码如下: content here content here c
我有一个问题,当网格为空时,为什么它显示 Page 1 of 0 不能是 Page 1 of 1 或更合理的东西吗? 我的代码 var xml=client.responseText;
我想将 Crashlytics 添加到我的项目中,我根据 Fabric Mac 应用程序制作了所有内容,现在我停留在 Step 2 of 2 when verifying installation 我
我正在使用 qt 从 html 代码生成一个 pdf 文件: QTextDocument *document = new QTextDocument(); document->setHtml(html
我是一名优秀的程序员,十分优秀!