- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我感兴趣的开源C ++ / Qt应用程序取决于CUDA。我的Macbook Pro(2014年中)有现货的Intel Iris Pro,没有NVidia显卡。当然,预构建的应用程序将无法运行。
我找到了这个模拟器:https://github.com/gtcasl/gpuocelot-但它仅针对Linux进行了测试,并且存在一些未在Mac上编译的未解决问题。
我有资料来源-我可以用较慢的处理成本来替换CUDA依赖项吗?我希望有类似的东西
重命名文件扩展名:.cu到.cpp
从make文件中删除CUDA引用
用等效的c ++ std lib头替换CUDA头
调整makefile,根据需要添加缺少的库引用
使用c ++代码(可能是Ocelot编写的)修复剩余的缺少的函数调用(希望只有一个或两个)
但是,恐怕不是那么简单。开始之前,我想进行一次健康检查。
最佳答案
在一般情况下,我认为没有“去CUDA-fy”应用程序的具体路线图。正如我认为没有特定的“机械”路线图来“ CUDA-fy”应用程序一样,我也没有找到一般的编程问题的特定路线图。
此外,我认为拟议的路线图存在缺陷。仅举一个例子,一个.cu
文件通常将具有特定于CUDA的引用,而用于编译.cpp
代码的普通c ++编译器将不允许这些引用。其中一些引用可能是依赖于CUDA运行时API的项,例如cudaMalloc
和cudaMemcpy
,尽管它们可以通过普通的c ++编译器传递(它们只是库调用),但这并不明智。将这些保留在原处,以便删除CUDA字符的应用程序。此外,某些参考可能是CUDA特定的语言功能,例如通过__global__
或__device__
声明设备代码,或使用相应的语法<<<...>>>
启动设备“内核”功能。这些不能通过普通的c ++编译器来传递,必须专门处理。此外,仅删除那些CUDA关键字和语法将不太可能产生有用的结果。
简而言之,必须重构代码。没有合理简明的路线图可以解释这样做的机械过程。我建议重构过程的复杂度应与将代码的非CUDA版本转换为CUDA版本的原始过程(如果有的话)大致相同。至少需要了解CUDA编程的一些非机械知识,才能理解CUDA的构造。
对于非常简单的CUDA代码,可能需要安排一些机械过程来取消对CUDA的编码。概括地说,基本的CUDA处理顺序如下:
为设备上的数据分配空间(可能使用cudaMalloc
),并将数据复制到设备上(可能使用cudaMemcpy
)
启动在设备上运行的功能(__global__
或“内核”功能)以处理数据并创建结果
将结果从设备复制回(也许再次使用cudaMemcpy
)
因此,一种简单的方法是:
消除cudaMalloc
/ cudaMemcpy
操作,从而将感兴趣的数据以其原始形式保留在主机上
将cuda处理函数(内核)转换为对主机数据执行相同操作的普通c ++函数
由于CUDA是并行处理体系结构,一种将固有并行CUDA“内核”代码转换为普通c ++代码的方法(上述步骤2)将使用一个循环或一组循环。但是除此之外,根据代码实际在做什么,路线图趋向于趋于分歧。此外,线程间通信,非变换算法(例如缩减)以及CUDA内在函数或其他特定于语言的功能的使用将使步骤2大大复杂化。
例如,让我们采用一个非常简单的矢量ADD代码。用于此目的的CUDA内核代码将通过许多特性来区分,这些特性将使其易于与CUDA实现进行相互转换:
没有线程间通信。问题是“令人尴尬的平行”。每个线程完成的工作都独立于所有其他线程。这仅描述了CUDA代码的有限子集。
不需要或不使用任何CUDA特定语言功能或内在函数(除了全局唯一的线程索引变量),因此内核代码已经可以识别为几乎完全有效的c ++代码。同样,此特征可能仅描述CUDA代码的有限子集。
因此,矢量添加代码的CUDA版本可能如下所示(出于演示目的,已大大简化):
#include <stdio.h>
#define N 512
// perform c = a + b vector add
__global__ void vector_add(const float *a, const float *b, float *c){
int idx = threadIdx.x;
c[idx]=a[idx]+b[idx];
}
int main(){
float a[N] = {1};
float b[N] = {2};
float c[N] = {0};
float *d_a, *d_b, *d_c;
int dsize = N*sizeof(float);
cudaMalloc(&d_a, dsize); // step 1 of CUDA processing sequence
cudaMalloc(&d_b, dsize);
cudaMalloc(&d_c, dsize);
cudaMemcpy(d_a, a, dsize, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, dsize, cudaMemcpyHostToDevice);
vector_add<<<1,N>>>(d_a, d_b, d_c); // step 2
cudaMemcpy(c, d_c, dsize, cudaMemcpyDeviceToHost); // step 3
for (int i = 0; i < N; i++) if (c[i] != a[i]+b[i]) {printf("Fail!\n"); return 1;}
printf("Success!\n");
return 0;
}
cudaMalloc
/
cudaMemcpy
操作,从而将感兴趣的数据以其原始形式保留在主机上
cudaMalloc
和
cudaMemcpy
行,而是计划直接在宿主代码中的
a[]
,
b[]
和
c[]
变量上进行操作。然后,剩下的步骤是将
vector_add
CUDA“内核”函数转换为普通的c ++函数。同样,必须了解一些CUDA基础知识,才能了解并行执行操作的程度。但是内核代码本身(除了使用
threadIdx.x
内置CUDA变量之外)是完全有效的c ++代码,并且没有线程间通信或其他复杂因素。因此,普通的c ++实现可能只是内核代码,被放置在并行范围内的适当的for循环迭代中(在本例中为
N
),并被放置在类似的c ++函数中:
void vector_add(const float *a, const float *b, float *c){
for (int idx=0; idx < N; idx++)
c[idx]=a[idx]+b[idx];
}
cudaMalloc
和
cudaMemcpy
操作
main
中的内核调用修正为普通的c ++函数调用
#include <stdio.h>
#define N 512
// perform c = a + b vector add
void vector_add(const float *a, const float *b, float *c){
for (int idx = 0; idx < N; idx++)
c[idx]=a[idx]+b[idx];
}
int main(){
float a[N] = {1};
float b[N] = {2};
float c[N] = {0};
vector_add(a, b, c);
for (int i = 0; i < N; i++) if (c[i] != a[i]+b[i]) {printf("Fail!\n"); return 1;}
printf("Success!\n");
return 0;
}
关于c++ - 删除CUDA依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34423660/
我知道如何通过iPhone开发创建sqlite数据库、向其中插入数据、删除行等,但我试图以编程方式删除整个数据库本身,但没有得到任何帮助。请有人指导我如何通过代码从设备中删除/删除整个 sqlite
请帮助指导如何在 Teradata 中删除数据库。 当我运行命令DROP DATABASE database_name时,我收到错误消息: *** Failure 3552 Cannot DROP d
Azure 警报规则的删除命令似乎不起作用,尝试了下面的方法,它返回状态为无内容,并且警报未被删除 使用的命令Remove-AzAlertRule -ResourceGroup "RGName"-Na
我在 flex 搜索中为大约50000个视频建立了索引,但是当它达到52000左右时,所有数据都被删除。嗯,这对我来说真的很奇怪,我没有为ES设置任何Heap大小或最小或最大大小的内存大小,因此它们没
我正在处理的问题是表单错误“输入由字母、数字、下划线或连字符组成的有效‘slug’。” 以下是我的表单字段验证: def clean_slug(self): slug = self.c
阅读文档,我希望 $("#wrap2").remove(".error") 从 中删除所有 .error 元素#wrap2。然而看看这个 JSFiddle: http://jsfiddle.net/h
嗨,我第一次尝试发现 laravel 我从 laravel 4.2 开始,我刚刚创建了一个新项目,但我误以为我写了这样的命令行 composer create-project laravel/lara
我已经在网上搜索了很长一段时间,但我找不到如何完全删除 apache 2.4 。 使用: Windows 7 c:\apache24\ 我已经尝试了所有命令,但没有任何效果。 httpd -k shu
可能是一个简单的答案,所以提前道歉(最少的编码经验)。 我正在尝试从任何列中删除具有特定字符串(经济 7)的任何行,并且一直在尝试离开此线程: How to drop rows from pandas
有几种方法可以删除/移除 vector 中的项目。 我有一个指针 vector ,我需要在类的析构函数中删除所有指针。 什么是最有效/最快甚至最安全的方式? // 1º std::for_each(v
我安装了一个 VNC 服务器并在某处阅读了我必须安装 xinetd 的信息。稍后我决定删除 VNC 服务器,所以我也删除了 xinetd。似乎 xinetd 删除了一些与 plesk 相关的文件,如果
我制作了一个从我们的服务器下载视频的应用。问题是: 当我取消下载时,我打电话: myAsyncTask.cancel(true) 我注意到,myAsyncTask 并没有在调用取消时停止...我的 P
是否可以在使用DELETE_MODEL删除模型之前检查模型是否存在我试图避免在尝试删除尚未创建的模型时收到错误消息。基本上我正在寻找对应的: DROP TABLE IF EXISTS 但对于模型。 最
我已经有了这个代码: 但它仍然会生成一个表行条目。 我想做的是,当输入的数量为0时,表行将被删除。请耐心等待,因为我是 php 和 mySQL 编码新手。 最佳答案 您忘记执行查询。应该是 $que
在 SharePoint 中,如果您删除/修改重复日历条目的单次出现,则不会真正删除/修改任何内容 - 相反,会创建一个新条目,告诉 SP 对于特定日期,该事件不存在或具有新参数. 因此,这可以通过删
在 routes.php 中我有以下路由: Route::post('dropzone', ['as' => 'dropzone.upload', 'uses' => 'AdminPhotoContr
在我的应用程序中,我正在尝试删除产品。当我第一次删除产品时,它会成功并且 URL 更改为/remove_category/15。我正在渲染到同一页面。现在,当我尝试删除另一个产品时,网址更改为/rem
这个问题被问了很多次,但给出的答案都是 GNU sed 特定的。 sed -i '' "/${FIND}/,+2d""$FILE" 给出“预期的上下文地址”错误。 有人可以给我一个例子,说明如何使用
在使用 V3 API 时,我找不到任何方法来删除和清理 Google map 。 我已经在 AJAX 站点中运行它,所以我想完全关闭它而无需重新加载页面。 我希望有一个 .unload() 或 .de
是否可以创建一个 Azure SQL 数据库用户来执行以下操作: 针对所有表和 View 进行 SELECT 创建/更改/删除 View 但用户不应该不拥有以下权限: 针对任何表或 View 插入/更
我是一名优秀的程序员,十分优秀!