我很困惑为什么 REPA 函数computeP将其结果打包在一个 monad 中。它具有以下类型签名。
computeP :: (Load r1 sh e, Target r2 e, Source r2 e, Monad m) =>
Array r1 sh e -> m (Array r2 sh e)
Run Code Online (Sandbox Code Playgroud)
在本教程中它说
这样做的原因是monad 给出了一个明确定义的序列概念,因此计算 P 强制在 monadic 计算的特定点完成并行评估。
同样,Stack Overflow 上的这个答案指出
Repa 中的并行计算必须是 monadic 的原因部分与懒惰有关,但主要是因为 Repa 无法处理嵌套并行性。Monad 的顺序属性在很大程度上解决了这个问题[.]
例如computeP:对使用哪个 monad 没有限制,所以我可以使用身份 monad。那么可以使用下面的函数来代替解包 monad,还是会因为它缺少这个顺序属性而产生意想不到的结果?如果可以的话,甚至有必要使用 monad 吗?
import Data.Functor.Identity
import Data.Array.Repa.Eval
import Data.Array.Repa
myComputeP :: (Load …Run Code Online (Sandbox Code Playgroud)ConfigService我在设置使用来设置 TypeORM 的单元测试时遇到问题。下面的测试失败并显示以下消息:
Nest 无法解析 TypeOrmModuleOptions 的依赖关系(?)。请确保索引 [0] 处的参数 ConfigService 在 TypeOrmCoreModule 上下文中可用。
我尝试过将其添加ConfigService为提供者,但没有成功。关于我做错了什么有什么想法吗?
import { ConfigModule, ConfigService } from '@nestjs/config';
import { Test } from '@nestjs/testing';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
describe('TypeORM setup', () => {
beforeEach(async () => {
await Test.createTestingModule({
providers: [ConfigService],
imports: [
ConfigModule.forRoot(),
TypeOrmModule.forRootAsync({
useFactory: (config: ConfigService) => ({ ...config.get('db') }),
inject: [ConfigService],
}),
],
}).compile();
});
it('dummy', () => {
true === true;
});
});
Run Code Online (Sandbox Code Playgroud) 我来了(根据我)C#中的结构和接口之间的奇怪区别.考虑这个接口和结构:
public interface INumber
{
void ChangeNumber(int n);
void Log();
}
public struct Number : INumber
{
private int n;
public void ChangeNumber(int n)
{
this.n = n;
}
public void Log()
{
Console.WriteLine(this.n);
}
}
Run Code Online (Sandbox Code Playgroud)
当我创建一个具有Number作为属性的新类时,使用ChangeNumber方法将n更改为2并使用Log打印该数字,它将打印0:
public class NumberContainer
{
public Number Number { get; set; }
public NumberContainer()
{
this.Number = new Number();
this.Number.ChangeNumber(2);
this.Number.Log(); //prints 0...
}
}
Run Code Online (Sandbox Code Playgroud)
过了一会儿,我意识到这是因为当我调用时this.Number.ChangeNumber(2);,我实际创建了一个新对象(因为getter)并将该数字更改为2.但后来我通过将Number属性更改为INumber属性来更改了一些代码:
public class NumberContainer
{
public INumber Number { get; set; }
public NumberContainer()
{
this.Number = …Run Code Online (Sandbox Code Playgroud) 想象一下,我有一个很大的整数排序列表(> 1000项).我需要能够在此列表上执行两个操作:删除下半部分并通过插入随机整数将列表再次填充到其原始大小.因为我做了大约一百万次这些操作,所以我需要它尽可能高效.
我做的第一件事就是使用List我通过在正确的位置添加新项目进行排序的方法.虽然删除排序列表的下半部分非常容易,但插入需要相当长的时间.
我尝试实现一个跳过列表,但经过一些测试后,列表的大小似乎必须至少为10000才真正重要,否则它的表现甚至比我的正常列表更糟糕.
这就是为什么我决定使用AVL树,所以我可以更快,更快地插入项目.但问题是我不知道删除这种二叉搜索树的下半部分的任何有效方法.
我的问题是:有没有一种有效的方法来做到这一点?还有其他我可以更轻松使用的数据结构吗?
如上所述,我做了一个小测试,显示了列表,跳过列表和AVL树之间的性能差异.我在msdn:Skip list tutorial上使用本教程制作了跳过列表.AVL树来自这里:AVL树.我在dropbox上传了测试:示例.还有关于pastebin:程序.
在测试中,我在计时时为每个数据结构添加了10万个项目.在我的电脑上,列表大约需要1秒,跳过列表需要0.5秒,AVL树需要0.045秒.如果我按照我的意愿做了一百万次,那么这个列表大约需要11.5天,但AVL树只需要大约半天.这个时间差异清楚地表明了我希望它有效的原因.
假设我正在创建一个可以抛出错误的简单解释器,例如
type Error = String
data Term = Con Int | Div Term Term
eval :: (MonadError Error m) => Term -> m Int
eval (Con a) = return a
eval (Div u v) = do
a <- eval u
b <- eval v
if b == 0 then
throwError "Division by zero"
else
return $ a `div` b
Run Code Online (Sandbox Code Playgroud)
具体错误处理程序的典型选择是Either Error.
runEval :: Term -> Either Error Int
runEval = eval
Run Code Online (Sandbox Code Playgroud)
现在假设我想扩展这个解释器来处理非确定性。例如,我可以添加一个Choice Term Term可以评估其第一个或第二个参数的术语。
data Term …Run Code Online (Sandbox Code Playgroud) 我正在尝试学习OpenCL,但是我很难确定要使用的地址空间,因为我只能找到汇编资源来声明这些地址空间是什么,而不是它们为什么存在或何时使用它们。资源至少太分散了,因此我希望将所有这些信息汇总在一起:所有的地址空间是什么,它们为什么存在,何时使用哪个地址空间,以及在内存和性能方面的优缺点是什么?
据我了解(可能过于简化),GPU具有两种物理类型的内存:全局内存,远离实际处理器,因此速度较慢,但很大,可供所有工作人员使用;而本地内存则接近实际处理器,但速度很快,但体积很小,其他工作人员无法访问。
直观上,local限定符确保将变量放置在本地内存上,而global限定符确保将变量放置在全局内存上,尽管我不确定这是否会发生。剩下private和constant限定词。这些的目的是什么?
也有一些隐式的限定词。例如,我认为规范提到了通用地址空间,该地址空间用于没有限定符的参数。这到底是做什么的?然后还有局部函数变量。这些地址的空间是什么?
这是一个使用我的直觉的示例,但是不知道我实际上在做什么:
示例:
假设我将类型long和长度为10000 的数组传递给内核,该内核将仅用于读取,然后我将声明它,global const因为它必须对所有工作人员都可用并且不会更改。我为什么不使用constant限定词?当通过CPU为该数组设置缓冲区时,实际上我也可以将数组设为只读,在我看来这与声明它相同const。如此反复,什么时候,为什么我会申报的东西constant还是global const?
在执行内存密集型任务时,将阵列复制到内核内部的本地阵列会更好吗?我的猜测是本地内存太小,但是如果数组的长度只有10怎么办?阵列何时会过大/过小?更笼统:什么时候值得将数据从全局内存复制到本地内存?
假设我还想传递此数组的长度,然后将其添加const int length到内核的参数中,但是我不确定为什么要省略global限定符,除非我见过其他人这样做。毕竟,length所有工人都必须可以使用。如果我是对的,那么length将有一个通用的地址空间,但是同样,我真的不知道这意味着什么。
我希望有经验的人可以解决这个问题。这不仅对我来说很棒,但对希望获得一些有关GPU内存管理实践知识的其他发烧友,我也希望如此。